2009-03-06 8 views
20

मेरे पास एक WPF Popup नियंत्रण है जिसमें कुछ संपादन नियंत्रण (सूची बॉक्स, टेक्स्ट बॉक्स, चेक बॉक्स) शामिल हैं जो बहुत सारे व्हाइटस्पेस के साथ रखे गए हैं।जब कोई पृष्ठभूमि क्षेत्र क्लिक किया जाता है तो एक WPF पॉपअप बंद क्यों होता है?

Popup.StaysOpenFalse पर सेट है, जो आवश्यक है। यदि उपयोगकर्ता एप्लिकेशन में कहीं और क्लिक करता है, तो संपादन ऑपरेशन को निरस्त माना जाना चाहिए और पॉपअप बंद होना चाहिए।

दुर्भाग्यवश पॉपअप भी पॉपअप के पृष्ठभूमि क्षेत्र (संपादन नियंत्रण के बीच की जगह) के भीतर क्लिक करता है जब भी पॉपअप बंद हो जाता है।

मैंने पॉपअप को Focusable पर सेट करने का प्रयास किया है। मैंने पॉपअप के बच्चे() को ध्यान देने योग्य बनाने की भी कोशिश की है। किसी भी मोर्चे पर कोई भाग्य नहीं।

इसके अलावा, माउस ईवेंट पॉपअप के माध्यम से सुरंग प्रतीत होता है। जब भी मैं क्लिक करता हूं तो पॉपअप के नीचे जो भी तत्व है, वह केंद्रित हो जाता है। यह Popup और Border (जिसमें मैं क्लिक कर रहा हूं) दोनों के बावजूद IsHitTestVisible और Focusable दोनों true पर सेट किए गए हैं।

उत्तर

28

अंत में, मैंने पाया कि निम्नलिखित काम किया। यह देखते हुए ...

<Popup x:Name="_popup" 
     StaysOpen="False" 
     PopupAnimation="Slide" 
     AllowsTransparency="True"> 

... मैं निर्माता में इस कोड InitializeComponent बुला के बाद इस्तेमाल किया ...

// Ensure that any mouse event that gets through to the 
// popup is considered handled, otherwise the popup would close 
_popup.MouseDown += (s, e) => e.Handled = true; 
+0

+1 बहुत अच्छा और सुरुचिपूर्ण है! –

+1

ग्रेट सॉल्यूशन! मैं EventCoCommand का उपयोग कर, जेनरिक.एक्सएएमएल पर परिभाषित नियंत्रण के साथ ऐसा करने में भी सक्षम था, आदेश में EventArgs को पास कर रहा था, और उसके बाद हैंडल = ट्रू सेट कर रहा था। धन्यवाद! – Dror

+1

यहां तक ​​कि हैंडलर को एक मुश्किल स्थान पर छेड़छाड़ करने का एक और तरीका 'पॉपअप' से प्राप्त 'आर्मर्डपॉप' वर्ग प्राप्त करना है। यह 'OnMouseDown' को ओवरराइड कर सकता है। मैं इसे डिफ़ॉल्ट पॉपअप क्लास में एक बग मानता हूं। –

0

मेरा सबसे अच्छा अनुमान है कि आपके पास कुछ पारदर्शिता समस्याएं चल रही हैं। पॉपअप पर पृष्ठभूमि ब्रश सेट करने का प्रयास करें।

+0

आपके उत्तर के लिए धन्यवाद। सीमा नियंत्रण पॉपअप के पूरे क्षेत्र को भरता है और इसमें एक ठोस ब्रश सेट –

6

यह अजीब है कि यह पॉपअप और सीमा पर फ़ोकस करने योग्य उपेक्षा होता प्रतीत होता है। मैं एक ट्रिगर में StaysOpen बदल कर अपनी समस्या को ठीक करने में सक्षम था जब माउस सीमा खत्म हो गया है:

<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <ToggleButton x:Name="btnPop" Content="Pop!" Width="100" Height="50"/> 
    <Popup Placement="Bottom" PlacementTarget="{Binding ElementName=btnPop}" IsOpen="{Binding IsChecked, ElementName=btnPop}"> 
     <Popup.Style> 
      <Style TargetType="{x:Type Popup}"> 
       <Setter Property="StaysOpen" Value="False"/> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding IsMouseOver, ElementName=brd}" Value="True"> 
         <Setter Property="StaysOpen" Value="True"/> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Popup.Style> 
     <Border x:Name="brd" Background="White" BorderThickness="1" BorderBrush="Black"> 
      <StackPanel> 
       <TextBox Margin="10"/> 
       <TextBlock Text="Some text is here." Margin="10"/> 
       <TextBox Margin="10"/> 
      </StackPanel>    
     </Border> 
    </Popup> 
</Grid> 
+0

असल में, यह मेरे लिए काम करता है।नोट करने के लिए केवल एक चीज है, @RobertMacnee, यह है कि आपको यह सुनिश्चित करना चाहिए कि आप पॉपअप तत्व पर 'StaysOpen' प्रॉपर्टी सेट नहीं करते हैं, इसे स्टाइल सेटर पर छोड़ा जाना चाहिए और पूरी तरह से ट्रिगर करना चाहिए अन्यथा यह काम नहीं करेगा । – Kezzer

1

आप अपने पॉपअप एक ToggleButton या बटन के अन्य प्रकार में नेस्ट है नहीं है? फिर पॉपअप स्तर पर रूटेड घटना को रोकना काम करने के लिए तार्किक होगा।

0

आप StayOpen = true सेट कर सकते हैं, और एक टाइमर सेट, पॉपअप के mouseleave घटना timer.Start() में, के रूप में 3 सेकंड के बाद इस तरह, इस पॉपअप बंद, mouseenter घटना में, timer.Stop()। यह काम करेगा।

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

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