खोज…
परिचय
Behavior
वर्ग से व्यवहार विरासत में मिलता है। System.Windows.Interactity
namespace। यह नेमस्पेस ओवररचिंग एक्सप्रेशन ब्लेंड एसडीके का एक हिस्सा है, लेकिन एक हल्का संस्करण, जो व्यवहार पुस्तकालयों के लिए उपयुक्त है, एक [नगेट पैकेज] [1] के रूप में उपलब्ध है। [१]: https://www.nuget.org/packages/System.Windows.Interactivity.WPF/
माउस व्हील इवेंट को इंटरसेप्ट करने के लिए सरल व्यवहार
व्यवहार को लागू करना
इस व्यवहार के कारण माउस व्हील ईवेंट्स को इनर ScrollViewer
से बबल तक पेरेंट ScrollViewer
जब इनर इसकी ऊपरी या निचली सीमा पर होता है। इस व्यवहार के बिना, घटनाएं इसे आंतरिक ScrollViewer
बाहर कभी नहीं करेंगी।
public class BubbleMouseWheelEvents : Behavior<UIElement>
{
protected override void OnAttached()
{
base.OnAttached();
this.AssociatedObject.PreviewMouseWheel += PreviewMouseWheel;
}
protected override void OnDetaching()
{
this.AssociatedObject.PreviewMouseWheel -= PreviewMouseWheel;
base.OnDetaching();
}
private void PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
var scrollViewer = AssociatedObject.GetChildOf<ScrollViewer>(includeSelf: true);
var scrollPos = scrollViewer.ContentVerticalOffset;
if ((scrollPos == scrollViewer.ScrollableHeight && e.Delta < 0) || (scrollPos == 0 && e.Delta > 0))
{
UIElement rerouteTo = AssociatedObject;
if (ReferenceEquals(scrollViewer, AssociatedObject))
{
rerouteTo = (UIElement) VisualTreeHelper.GetParent(AssociatedObject);
}
e.Handled = true;
var e2 = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);
e2.RoutedEvent = UIElement.MouseWheelEvent;
rerouteTo.RaiseEvent(e2);
}
}
}
व्यवहार, इस प्रकार के UIElement
में, इस प्रकार के नियंत्रण को संलग्न करने में सक्षम होने के लिए, T
के नियंत्रण के प्रकार के साथ Behavior<T>
आधार-वर्ग को UIElement
। जब Behavior
XAML से OnAttached
जाता है, तो OnAttached
विधि कहा जाता है। यह विधि व्यवहार को नियंत्रित करने की घटनाओं से संबद्ध करने की अनुमति देती है ( AssociatedControl
माध्यम से)। एक समान विधि, OnDetached
को कहा जाता है जब व्यवहार को संबंधित तत्व से OnDetached
करने की आवश्यकता होती है। किसी भी घटना संचालकों को हटाने के लिए देखभाल की जानी चाहिए, या स्मृति लीक से बचने के लिए वस्तुओं को साफ करना चाहिए।
करने के लिए यह व्यवहार हुक PreviewMouseWheel
घटना है, जो इसे से पहले घटना रोकना एक बदलाव देता ScrollViewer
यह देखने के लिए एक मौका है। यह देखने की स्थिति की जांच करता है कि क्या दृश्य पेड़ को किसी ScrollViewer
उच्च पदानुक्रम तक घटना को आगे बढ़ाने की आवश्यकता है। यदि ऐसा है, तो यह e.Handled
को true
e.Handled
ताकि ईवेंट की डिफ़ॉल्ट कार्रवाई को रोका जा सके। यह तब उठाती है एक नया MouseWheelEvent
AssociatedObject
लिए रूट किया गया। अन्यथा, ईवेंट को सामान्य रूप से रूट किया जाता है।
XAML में एक तत्व के लिए व्यवहार संलग्न करना
सबसे पहले, एक्सएएमएल में उपयोग किए जाने से पहले interactivity
xml-namespace को दायरे में लाया जाना चाहिए। निम्नलिखित लाइन को अपने XAML के नामस्थानों में जोड़ें।
xmlns: अन्तरक्रियाशीलता = " http://schemas.microsoft.com/expression/2010/interactivity "
व्यवहार को इस तरह संलग्न किया जा सकता है:
<ScrollViewer>
<!--...Content...-->
<ScrollViewer>
<interactivity:Interaction.Behaviors>
<behaviors:BubbleMouseWheelEvents />
</interactivity:Interaction.Behaviors>
<!--...Content...-->
</ScrollViewer>
<!--...Content...-->.
</ScrollViewer>
यह एक बनाता है Behaviors
भीतरी पर एक संलग्न संपत्ति के रूप में संग्रह ScrollViewer
है कि एक शामिल BubbleMouseWheelEvents
व्यवहार।
यह विशेष व्यवहार किसी भी मौजूदा नियंत्रण से जुड़ा हो सकता है जिसमें एक एम्बेडेड ScrollViewer
, जैसे कि GridView
, और यह अभी भी सही ढंग से काम करेगा।