Vorgehensweise: Erstellen eines benutzerdefinierten Routingereignisses
Damit Ihr benutzerdefiniertes Ereignis das Ereignisrouting unterstützt, müssen Sie eine RoutedEvent mithilfe der RegisterRoutedEvent-Methode registrieren. In diesem Beispiel werden die Grundlagen des Erstellens eines benutzerdefinierten Routingereignisses veranschaulicht.
Beispiel
Wie im folgenden Beispiel gezeigt, registrieren Sie zunächst eine RoutedEvent mithilfe der RegisterRoutedEvent-Methode. Üblicherweise sollte der Name des statischen Felds RoutedEvent mit dem Suffix Eventenden. In diesem Beispiel sind der Name des Ereignisses Tap
und die Routingstrategie des Ereignisses Bubble. Nach dem Registrierungsaufruf können Sie Add-and-Remove Common Language Runtime (CLR)-Ereignisaccessoren für das Ereignis bereitstellen.
Beachten Sie, dass das Ereignis zwar über die OnTap
-virtuelle Methode in diesem bestimmten Beispiel ausgelöst wird, die Art und Weise, wie Sie Ihr Ereignis auslösen oder darauf reagieren, hängt jedoch von Ihren Anforderungen ab.
Beachten Sie auch, dass in diesem Beispiel grundsätzlich eine ganze Unterklasse von Buttonimplementiert wird; diese Unterklasse wird als separate Assembly erstellt und dann als benutzerdefinierte Klasse auf einer separaten XAML-Seite instanziiert. Dies ist die Veranschaulichung des Konzepts, dass unterklassige Steuerelemente in Strukturen eingefügt werden können, die aus anderen Steuerelementen bestehen, und dass in dieser Situation benutzerdefinierte Ereignisse für diese Steuerelemente über die gleichen Ereignisroutingfunktionen verfügen wie jedes systemeigene WPF-Element.
public class MyButtonSimple: Button
{
// Create a custom routed event by first registering a RoutedEventID
// This event uses the bubbling routing strategy
public static readonly RoutedEvent TapEvent = EventManager.RegisterRoutedEvent(
"Tap", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyButtonSimple));
// Provide CLR accessors for the event
public event RoutedEventHandler Tap
{
add { AddHandler(TapEvent, value); }
remove { RemoveHandler(TapEvent, value); }
}
// This method raises the Tap event
void RaiseTapEvent()
{
RoutedEventArgs newEventArgs = new RoutedEventArgs(MyButtonSimple.TapEvent);
RaiseEvent(newEventArgs);
}
// For demonstration purposes we raise the event when the MyButtonSimple is clicked
protected override void OnClick()
{
RaiseTapEvent();
}
}
Public Class MyButtonSimple
Inherits Button
' Create a custom routed event by first registering a RoutedEventID
' This event uses the bubbling routing strategy
Public Shared ReadOnly TapEvent As RoutedEvent = EventManager.RegisterRoutedEvent("Tap", RoutingStrategy.Bubble, GetType(RoutedEventHandler), GetType(MyButtonSimple))
' Provide CLR accessors for the event
Public Custom Event Tap As RoutedEventHandler
AddHandler(ByVal value As RoutedEventHandler)
Me.AddHandler(TapEvent, value)
End AddHandler
RemoveHandler(ByVal value As RoutedEventHandler)
Me.RemoveHandler(TapEvent, value)
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As RoutedEventArgs)
Me.RaiseEvent(e)
End RaiseEvent
End Event
' This method raises the Tap event
Private Sub RaiseTapEvent()
Dim newEventArgs As New RoutedEventArgs(MyButtonSimple.TapEvent)
MyBase.RaiseEvent(newEventArgs)
End Sub
' For demonstration purposes we raise the event when the MyButtonSimple is clicked
Protected Overrides Sub OnClick()
Me.RaiseTapEvent()
End Sub
End Class
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:custom="clr-namespace:SDKSample;assembly=SDKSampleLibrary"
x:Class="SDKSample.RoutedEventCustomApp"
>
<Window.Resources>
<Style TargetType="{x:Type custom:MyButtonSimple}">
<Setter Property="Height" Value="20"/>
<Setter Property="Width" Value="250"/>
<Setter Property="HorizontalAlignment" Value="Left"/>
<Setter Property="Background" Value="#808080"/>
</Style>
</Window.Resources>
<StackPanel Background="LightGray">
<custom:MyButtonSimple Name="mybtnsimple" Tap="TapHandler">Click to see Tap custom event work</custom:MyButtonSimple>
</StackPanel>
</Window>
Tunnelereignisse werden auf die gleiche Weise erstellt, jedoch wird RoutingStrategy im Registrierungsaufruf auf Tunnel gesetzt. Standardmäßig werden Tunnelereignisse in WPF dem Wort "Vorschau" vorangestellt.
Ein Beispiel für die Funktionsweise von Bubblingereignissen finden Sie unter Handle a Routed Event.
Siehe auch
.NET Desktop feedback