2014-06-30 7 views
5

दूसरे दिन इस मुद्दे से लड़ रहे हैं।अदृश्य खोला पॉपअप

पुन: पेश करने के लिए, नई WPF आवेदन बनाने के लिए, XAML

<StackPanel Orientation="Horizontal" VerticalAlignment="Top"> 
    <Button Width="100" Height="100" MouseMove="Button_MouseMove"/> 
    <Popup x:Name="popup" StaysOpen="False" AllowsTransparency="True" Placement="Center"> 
     <TextBlock>Some random text</TextBlock> 
    </Popup> 
    <CheckBox IsChecked="{Binding (Popup.IsOpen), ElementName=popup}">Popup</CheckBox> 
</StackPanel> 

और कोड

private void Button_MouseMove(object sender, MouseEventArgs e) 
{ 
    popup.IsOpen = true; 
} 

माउस ले जाएँ बटन, पॉपअप खोलने बंद करने के लिए कहीं और क्लिक करें। बग के लिए बटन पर क्लिक करें: पॉपअप IsOpen है == सच, (चेक बॉक्स पर या हैंडलर में ब्रेकप्वाइंट साथ देखा जा सकता है), जबकि यह अदृश्य है।

WTF?

और अपने मूल समस्या है, ऐसा लगता है, क्या की स्थापना IsOpen तत्काल नहीं है। उदाहरण के लिए, जब मैं कोशिश Popup के MouseMove घटना में false करने के लिए इसे स्थापित करने के लिए, तो मैं मिल Button की MouseEnter और MouseMove घटनाओं सही दौरान कि

IsOpen = true; 

ही true करने के लिए इसे स्थापित करने के साथ निकाल दिया, वहाँ 2 हैं (!) MouseMove घटनाओं होती है, तो देखने के लिए ईवेंट हैंडलर में इस लाइन डाल यह

System.Diagnostics.Trace.WriteLine("M"); 

होगा वी.एस. की आउटपुट विंडो में 2 एम, जबकि Popup (जब StayOpen=false) माउस घटनाओं को कैप्चर करने का मानना ​​है और यह करता है, लेकिन तुरंत नहीं है।

कोई मुझे बता सकते हैं क्या उस पर जा रहे हैं? मेरे पास कोई घटनाओं के लिए होता है दौरान चाहते हैं (या कुछ ही समय बाद? इसकी जांच करने का अगर यह सच है?) IsOpen की स्थापना। पहले से ही चीजों के दर्जनों की कोशिश की: Dispatcher.InvokeAsync, चर, टाइमर, आदि

+0

की [WPF पॉपअप ध्यान केंद्रित खो देता है लेकिन खोला रहता है] संभव डुप्लिकेट (http://stackoverflow.com/questions/14404897/WPF-पॉपअप-खो देता है फोकस बल्कि रहता खोला)। वहां जवाब देखें: संभवतः IsOpen के लिए बाध्यकारी StaysOpen प्रॉपर्टी को सही ढंग से कार्य नहीं करने का कारण बनता है ... – qqbenq

+0

@qqbenq, फोकस के साथ कुछ भी नहीं है। यहां बाध्यकारी केवल समस्या का प्रदर्शन करना है (इसे हटाएं और ब्रेकपॉइंट = एक ही समस्या का उपयोग करें)। – Sinatr

+0

'माउस पॉइंटर अपने मूल ऑब्जेक्ट पर चलता है जब एक पॉपअप स्वचालित रूप से नहीं खुलता है। यदि आप पॉपअप को स्वचालित रूप से खोलना चाहते हैं, तो टूलटिप या टूलटिप सेवा वर्ग का उपयोग करें। अधिक जानकारी के लिए टूलटिप Overview.', [यहां] (http://msdn.microsoft.com/en-us/library/ms749018 (v = vs.110) .aspx) – Kcvin

उत्तर

4

मुझे लगता है कि आप अतुल्यकालिक धारणा के साथ सही कर रहे हैं। फोकस हानि के दौरान, IsOpen का मान गलत पर सेट है, लेकिन बटन के MouseMove इसे फिर से खोलने के लिए ट्रिगर करता है। अंदर कुछ अजीब जादू कोड तोड़ देता है।

2 संभव समाधान मैंने पाया अपनी आवश्यकताओं पर निर्भर करता है,:,

  1. स्पष्ट रूप false को IsOpen सेट करने के बाद पॉपअप बंद (बैश async)
  2. # 1 + पॉपअप के दौरान बटन अक्षम IsOpen == true

पहले दृष्टिकोण बटन पर क्लिक दौरान पॉपअप छुपा देगा। दूसरा दृष्टिकोण एक मामूली अस्थिर के साथ आ जाएगा - जब तेजी से बटन पर क्लिक - लेकिन यह पॉपअप खोला रखता है:

पहले दृष्टिकोण के लिए, निम्न ईवेंट प्रबंधकों का उपयोग करें (आप संपत्ति की जाँच नहीं कर सकते हैं पहले):

private void Button_MouseMove(object sender, MouseEventArgs e) 
{ 
    popup.IsOpen = true; 
} 

private void Popup_OnClosed(object sender, EventArgs e) 
{ 
    if (popup.IsOpen) 
     popup.IsOpen = false; 
} 

दूसरा दृष्टिकोण के लिए, एक BoolInvertConverter उपयोग करें और यह पॉपअप के लिए एक तरह से बाँध:

IsEnabled="{Binding (Popup.IsOpen), ElementName=popup, Converter={StaticResource BoolInvertConverter}, Mode=OneWay}" 
+0

परिस्थितियों को अच्छी तरह से काम करने लगता है। Kudos =) – icebat

+0

'बंद 'और सेटिंग' IsOpen = false' एक धोखा है, लेकिन यह पूरी तरह से काम करता है, धन्यवाद! मैं पहले से ही क्लिक के साथ समस्या यह है कि बटन के ऊपर 'Popup' प्रदर्शित करके (नीचे एक के रूप में एक ही बटन के साथ), हल तो आप * क्लिक नहीं कर सकते * यह पी – Sinatr

+0

= @Sinatr हाँ, यह बहुत ज्यादा एक समाधान/धोखा है, एक फिक्स के बजाय। यदि आप इसे ठीक करना चाहते हैं, तो माइक्रोसॉफ्ट पर जाएं और अपने कोड में चारों ओर खोदें! :) – Herdo

2

खैर, MouseMove और MouseEnter दोनों कहा जाता है जब आप बटन (यहां तक ​​कि स्पेस बार कुंजी के साथ करता है, तो) प्रेस कर रहे हैं, इसलिए जब Popup बंद करने के लिए कोशिश कर रहा है इस स्थिति की ओर जाता है जबकि IsOpen एक ही समय में सत्य पर सेट है। सरल समाधान इन दो घटनाओं को विभाजित करना हो सकता है।

MouseEnter पर एक संभावित तरीका हो सकता है और पर होवर करते समय केवल एक बार Popup खोलें। बस उदाहरण के रूप में:

private Button currentPopupHolder; 
private void Button_MouseEnter(object sender, MouseEventArgs e) 
{ 
    var btn = sender as Button; 
    if (currentPopupHolder != btn) 
    { 
     popup.IsOpen = true; 
     currentPopupHolder = btn; 
    } 
} 

private void Button_MouseLeave(object sender, MouseEventArgs e) 
{ 
    currentPopupHolder = null; 
} 

जबकि एक ही Button (समय था जब बटन दबाने सहित) इस घटनाओं Popup से एक बार फिर नहीं खोला जाना चाहिए उत्पन्न करता है।

+0

आइडिया अच्छा है, लेकिन @Herdo से 'ऑनक्लोज्ड' ईवेंट समाधान में स्पष्ट 'IsOpen = true' बेहतर है। – Sinatr

संबंधित मुद्दे