Szukaj…


Wprowadzenie

Zachowania WPF pozwalają programistom zmienić sposób działania mechanizmów kontrolnych WPF w odpowiedzi na zdarzenia systemowe i użytkownika. Zachowania dziedziczą po klasie Behavior przestrzeni nazw System.Windows.Interactity . Ta przestrzeń nazw jest częścią nadrzędnego zestawu SDK Expression Blend, ale lżejsza wersja, odpowiednia dla bibliotek zachowania, jest dostępna jako [pakiet nuget] [1]. [1]: https://www.nuget.org/packages/System.Windows.Interactivity.WPF/

Proste zachowanie do przechwytywania zdarzeń kółka myszy

Wdrażanie zachowania

To zachowanie spowoduje, że zdarzenia kółka myszy z wewnętrznego ScrollViewer będą się ScrollViewer do nadrzędnego ScrollViewer gdy wewnętrzny znajdzie się na górnej lub dolnej granicy. Bez tego zachowania zdarzenia nigdy nie wyjdą z wewnętrznego 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);
        }
    }
}

Zachowania stanowią podklasę klasy bazowej Behavior<T> , przy czym T jest rodzajem kontroli, do której może się przyłączyć, w tym przypadku UIElement . Kiedy instancja Behavior jest utworzona z XAML, OnAttached jest metoda OnAttached . Ta metoda umożliwia zachowanie się połączenia z zdarzeniami z kontrolki, do której jest przyłączony (poprzez AssociatedControl ). Podobną metodę OnDetached się, gdy zachowanie musi zostać odłączone od powiązanego elementu. Należy zachować ostrożność, aby usunąć programy obsługi zdarzeń lub w inny sposób wyczyścić obiekty, aby uniknąć wycieków pamięci.

To zachowanie łączy się ze zdarzeniem PreviewMouseWheel , co daje mu możliwość przechwycenia zdarzenia, zanim ScrollViewer będzie mógł je zobaczyć. Sprawdza pozycję, aby sprawdzić, czy musi przekazać zdarzenie w górę drzewa wizualnego do dowolnej wyższej hierarchii ScrollViewer . Jeśli tak, ustawia wartość e.Handled na true aby zapobiec domyślnej akcji zdarzenia. Następnie wywołuje nowy MouseWheelEvent kierowany do AssociatedObject . W przeciwnym razie zdarzenie jest kierowane normalnie.


Dołączanie zachowania do elementu w XAML

Po pierwsze, interactivity przestrzeń nazw xml musi zostać sprowadzona do zakresu, zanim będzie można jej użyć w XAML. Dodaj następujący wiersz do przestrzeni nazw swojej XAML.

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

Zachowanie można dołączyć w następujący sposób:

<ScrollViewer>
    <!--...Content...-->
    <ScrollViewer>
        <interactivity:Interaction.Behaviors>
            <behaviors:BubbleMouseWheelEvents />
        </interactivity:Interaction.Behaviors>
        <!--...Content...-->
    </ScrollViewer>
    <!--...Content...-->.
</ScrollViewer>

Spowoduje to utworzenie kolekcji Behaviors jako właściwości Attached w wewnętrznej ScrollViewer która zawiera zachowanie BubbleMouseWheelEvents .

To szczególne zachowanie można również dołączyć do dowolnego istniejącego elementu sterującego, który zawiera osadzony ScrollViewer , takiego jak GridView , i nadal działałby poprawnie.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow