Jak utworzyć niestandardowe zdarzenie trasowane
Aby zdarzenie niestandardowe obsługiwało routing zdarzeń, należy zarejestrować RoutedEvent go przy użyciu RegisterRoutedEvent metody . W tym przykładzie przedstawiono podstawy tworzenia niestandardowego zdarzenia kierowanego.
Przykład
Jak pokazano w poniższym przykładzie, najpierw zarejestrujesz metodę RoutedEvent RegisterRoutedEvent przy użyciu metody . Zgodnie z konwencją RoutedEvent nazwa pola statycznego powinna kończyć się sufiksem Zdarzenie. W tym przykładzie nazwa zdarzenia to Tap
, a strategia routingu zdarzenia to Bubble. Po wywołaniu rejestracji można podać akcesory zdarzeń środowiska uruchomieniowego języka wspólnego (CLR) add-and-remove dla zdarzenia.
Należy pamiętać, że mimo że zdarzenie jest wywoływane za pośrednictwem OnTap
metody wirtualnej w tym konkretnym przykładzie, sposób zgłaszania zdarzenia lub reagowanie na zmiany zależy od potrzeb.
Należy również pamiętać, że ten przykład zasadniczo implementuje całą podklasę ; ta podklasa Buttonjest kompilowana jako oddzielny zestaw, a następnie tworzona jako klasa niestandardowa na oddzielnej stronie XAML. To jest zilustrowanie koncepcji, że podklasowane kontrolki można wstawić do drzew składających się z innych kontrolek, a w tej sytuacji zdarzenia niestandardowe na tych kontrolkach mają takie same możliwości routingu zdarzeń, jak każdy natywny element WPF.
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>
Zdarzenia tunelowania są tworzone w taki sam sposób, ale z ustawioną wartością RoutingStrategy Tunnel w wywołaniu rejestracji. Zgodnie z konwencją zdarzenia tunelowania w WPF są poprzedzone słowem "Wersja zapoznawcza".
Aby zobaczyć przykład działania zdarzeń bubbling, zobacz Handle a Routed Event (Obsługa zdarzenia trasowanego).
Zobacz też
.NET Desktop feedback