2010-02-22 18 views
8

कल्पना करें कि आप एक WPF Popup (उदा। बटनक्लिक) के माध्यम से स्थिति खोलें। आपके पास कुछ आइटमों के साथ Popup में सीधे ListBox है, इसलिए आपको स्क्रॉल करने में सक्षम होना चाहिए। कल्पना कीजिए कि यह आपका Custom Control है और यह ScrollViewer में स्थित है।डब्ल्यूपीएफ पता स्क्रॉलिंग पैरेंट नियंत्रण

अब यदि आप अपने माउस के साथ Popup सतह से बाहर स्क्रॉल करते हैं और स्क्रॉल करते हैं, तो क्या होता है? आप ऊपर और नीचे स्क्रॉल करते हैं लेकिन Popup खोले गए! और यह समस्या है।

सवाल यह है कि नियंत्रण के अंदर से कैसे पता लगाया जाए, कि VisualTree में कुछ अन्य अज्ञात अभिभावक नियंत्रण स्क्रॉल करना शुरू कर दिया है? और लगातार IsDropDownOpen = false सेट करें?

+0

मेरे पास एक ही प्रश्न और समस्या है। मैं अपने ग्रिड को स्क्रॉल करता हूं और कस्टम ऑपरेशन के साथ मेरा पॉपअप एक ही स्थान पर रहता है! मुझे ग्रिड के साथ पॉपअप स्क्रॉल करने की ज़रूरत है! – Evgeny

उत्तर

10

हम ScrollViewer के भीतर मौजूद तत्वों के साथ उपयोग के लिए एक ट्रिगर लिख सकते हैं।

<Grid> 
    <ScrollViewer VerticalAlignment="Top" Height="200"> 
     <StackPanel HorizontalAlignment="Left"> 
      <Button Name="button" Content="Open"> 
       <i:Interaction.Triggers> 
        <i:EventTrigger EventName="Click"> 
         <ei:ChangePropertyAction TargetObject="{Binding ElementName=popup}" PropertyName="IsOpen" Value="True"/> 
        </i:EventTrigger> 
        <local:ScrollTrigger> 
         <ei:ChangePropertyAction TargetObject="{Binding ElementName=popup}" PropertyName="IsOpen" Value="False"/> 
        </local:ScrollTrigger> 
       </i:Interaction.Triggers> 
      </Button> 
      <Popup Name="popup" PlacementTarget="{Binding ElementName=button}"> 
       <TextBlock Background="White" Text="Sample text"/> 
      </Popup> 
      <Rectangle Width="100" Height="100" Fill="Red"/> 
      <Rectangle Width="100" Height="100" Fill="Green"/> 
      <Rectangle Width="100" Height="100" Fill="Blue"/> 
      <Rectangle Width="100" Height="100" Fill="Yellow"/> 
     </StackPanel> 
    </ScrollViewer> 
</Grid> 

हम एक बटन एक Popup और किसी भी माता-पिता ScrollViewerScrollTrigger कार्यों आग और फिर हम पॉपअप बंद कर सकते हैं का कारण बनता है में किसी भी स्क्रॉल खुलती है: यहाँ एक पूरा नमूना अनुप्रयोग है। ध्यान दें कि ट्रिगर Button से जुड़ा हुआ है और Popup नहीं है। हम दृश्य पेड़ में मौजूद किसी भी आस-पास के तत्व का उपयोग कर सकते हैं। यह भी ध्यान रखें कि हम Popup खोलने के लिए एक और ट्रिगर का उपयोग करते हैं लेकिन यह कैसे खुलता है मूल प्रश्न के लिए महत्वपूर्ण नहीं है। यह सिर्फ सभी माता पिता ScrollChanged घटनाओं के लिए लगा देते हैं और किसी भी कार्रवाई निहित आग

class ScrollTrigger : TriggerBase<FrameworkElement> 
{ 
    protected override void OnAttached() 
    { 
     AssociatedObject.Loaded += new RoutedEventHandler(AssociatedObject_Loaded); 
    } 

    void AssociatedObject_Loaded(object sender, RoutedEventArgs e) 
    { 
     foreach (var scrollViewer in GetScrollViewers()) 
      scrollViewer.ScrollChanged += new ScrollChangedEventHandler(scrollViewer_ScrollChanged); 
    } 

    void scrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e) 
    { 
     InvokeActions(e.OriginalSource); 
    } 

    IEnumerable<ScrollViewer> GetScrollViewers() 
    { 
     for (DependencyObject element = AssociatedObject; element != null; element = VisualTreeHelper.GetParent(element)) 
      if (element is ScrollViewer) yield return element as ScrollViewer; 
    } 
} 

ScrollTrigger बहुत सरल है,:

यहाँ ScrollTrigger है। नमूने में हम Popup को बंद करने के लिए ChangePropertyAction का उपयोग करते हैं।

आप व्यवहार से परिचित नहीं हैं, तो अभिव्यक्ति ब्लेंड 4 एसडीके स्थापित करने और इन नामस्थान जोड़ें:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 

और अपनी परियोजना के लिए System.Windows.Interactivity और Microsoft.Expression.Interactions जोड़ें।

1

मुझे नहीं पता कि आपके नियंत्रण कैसा हैं, लेकिन क्या आप फोकस ईवेंट पर नियंत्रण के अपने उद्घाटन/समापन को आधार नहीं बना सकते? और अगर पॉपअप को बंद करने के लिए यह फोकस खो देता है? शायद मैं गलत समझ सकता हूं, क्या आप एक कोड स्निपेट पोस्ट कर सकते हैं? डैनियल