Sdílet prostřednictvím


Postupy: Přidání zpracování třídy pro směrovanou událost

Směrované události je možné zpracovat buď obslužnými rutinami třídy, nebo obslužnými rutinami instancí na libovolném daném uzlu v trase. Obslužné rutiny třídy jsou vyvolány jako první a mohou být používány implementacemi třídy k potlačení událostí z zpracování instancí nebo zavést jiné chování specifické pro události, které vlastní základní třídy. Tento příklad znázorňuje dvě úzce související techniky pro implementaci obslužných rutin tříd.

Příklad

Tento příklad používá vlastní třídu založenou na panelu Canvas . Základní místně aplikace spočívá v tom, že vlastní třída zavádí chování svých podřízených prvků, včetně zachycení všech levých kliknutí na tlačítko myši a jejich označení zvládnuto, před vyvolání podřízené třídy elementu nebo jakékoli obslužné rutiny instance.

Třída UIElement zveřejňuje virtuální metodu, která umožňuje zpracování třídy v PreviewMouseLeftButtonDown události jednoduše přepsáním události. Toto je nejjednodušší způsob, jak implementovat zpracování tříd, pokud je taková virtuální metoda k dispozici někde v hierarchii třídy. Následující kód ukazuje implementaci OnPreviewMouseLeftButtonDown v "MyEditContainer", který je odvozen z Canvas. Implementace označí událost jako zpracovanou v argumentech a pak přidá kód, který zdrojovému prvku poskytne základní viditelnou změnu.

protected override void OnPreviewMouseRightButtonDown(System.Windows.Input.MouseButtonEventArgs e)
{
    e.Handled = true; //suppress the click event and other leftmousebuttondown responders
    MyEditContainer ec = (MyEditContainer)e.Source;
    if (ec.EditState)
    { ec.EditState = false; }
    else
    { ec.EditState = true; }
    base.OnPreviewMouseRightButtonDown(e);
}
Protected Overrides Sub OnPreviewMouseRightButtonDown(ByVal e As System.Windows.Input.MouseButtonEventArgs)
    e.Handled = True 'suppress the click event and other leftmousebuttondown responders
    Dim ec As MyEditContainer = CType(e.Source, MyEditContainer)
    If ec.EditState Then
        ec.EditState = False
    Else
        ec.EditState = True
    End If
    MyBase.OnPreviewMouseRightButtonDown(e)
End Sub

Pokud není pro základní třídy nebo pro tuto konkrétní metodu k dispozici žádná virtuální, lze zpracování tříd přidat přímo pomocí metody EventManager utility třídy, RegisterClassHandler. Tato metoda by měla být volána pouze v rámci statické inicializace tříd, které přidávají zpracování tříd. Tento příklad přidá další obslužnou rutinu pro PreviewMouseLeftButtonDown , a v tomto případě zaregistrovaná třída je vlastní třída. Naproti tomu při použití virtuálních objektů je registrovaná třída skutečně UIElement základní třídou. V případech, kdy se základní třídy a podtřídy zpracovávají jednotlivé třídy registru, jsou obslužné rutiny podtřídy vyvolány jako první. Chování v aplikaci by bylo, že první tato obslužná rutina zobrazí pole se zprávou a pak se zobrazí vizuální změna v obslužné rutině virtuální metody.

static MyEditContainer()
{
  EventManager.RegisterClassHandler(typeof(MyEditContainer), PreviewMouseRightButtonDownEvent, new RoutedEventHandler(LocalOnMouseRightButtonDown));
}
internal static void LocalOnMouseRightButtonDown(object sender, RoutedEventArgs e)
{
  MessageBox.Show("this is invoked before the On* class handler on UIElement");
  //e.Handled = true; //uncommenting this would cause ONLY the subclass' class handler to respond
}
Shared Sub New()
    EventManager.RegisterClassHandler(GetType(MyEditContainer), PreviewMouseRightButtonDownEvent, New RoutedEventHandler(AddressOf LocalOnMouseRightButtonDown))
End Sub
Friend Shared Sub LocalOnMouseRightButtonDown(ByVal sender As Object, ByVal e As RoutedEventArgs)
    MessageBox.Show("this is invoked before the On* class handler on UIElement")
    'e.Handled = True //uncommenting this would cause ONLY the subclass' class handler to respond
End Sub

Viz také