Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Routade händelser kan hanteras antingen av klasshanterare eller instanshanterare på en viss nod i vägen. Klasshanterare anropas först och kan användas av klassimplementeringar för att förhindra händelser från instanshantering eller införa andra händelsespecifika beteenden för händelser som ägs av basklasser. Det här exemplet illustrerar två nära relaterade tekniker för att implementera klasshanterare.
Exempel
I det här exemplet används en anpassad klass baserat på panelen Canvas. Den grundläggande premissen för applikationen är att den anpassade klassen introducerar beteenden på sina underordnade element, inklusive att fånga upp vänsterklick och markera dem som hanterade, innan den underordnade elementklassens metoder eller instanshanterare anropas.
Klassen UIElement exponerar en virtuell metod som möjliggör klasshantering på händelsen PreviewMouseLeftButtonDown genom att helt enkelt åsidosätta händelsen. Det här är det enklaste sättet att implementera klasshantering om en sådan virtuell metod är tillgänglig någonstans i klassens hierarki. Följande kod visar implementeringen OnPreviewMouseLeftButtonDown i "MyEditContainer" som härleds från Canvas. Implementeringen markerar händelsen som hanterad i argumenten och lägger sedan till kod för att ge källelementet en grundläggande synlig ändring.
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
Om ingen virtuell dator är tillgänglig för basklasser eller för den specifika metoden kan klasshantering läggas till direkt med hjälp av en verktygsmetod för klassen EventManager, RegisterClassHandler. Den här metoden bör bara anropas inom den statiska initieringen av klasser som lägger till klasshantering. Det här exemplet lägger till en annan hanterare för PreviewMouseLeftButtonDown , och i det här fallet är den registrerade klassen den anpassade klassen. När du däremot använder virtuell funktionalitet är den registrerade klassen i själva verket UIElement-basklassen. I de fall där både basklasser och underklasser registrerar klasshantering anropas underklasshanterarna först. Beteendet i ett program skulle vara att först skulle den här hanteraren visa sin meddelanderuta och sedan visas den visuella ändringen i den virtuella metodens hanterare.
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
Se även
.NET Desktop feedback