Практическое руководство. Создание пользовательских перенаправленных событий
Чтобы пользовательское событие поддерживало маршрутизацию событий, необходимо зарегистрировать событие RoutedEvent, используя метод RegisterRoutedEvent. В этом примере демонстрируются основные принципы создания пользовательских перенаправленных событий.
Пример
Как показано в следующем примере, сначала выполняется регистрация RoutedEvent с помощью метода RegisterRoutedEvent. По соглашению имя статического поля RoutedEvent должно заканчиваться суффиксом Event. В этом примере имя события — Tap
, а стратегия маршрутизации этого события — Bubble. После вызова регистрации можно предоставить для этого события методы доступа к событию добавления и удаления среды CLR.
Обратите внимание, что несмотря на то что в этом примере событие вызывается виртуальным методом OnTap
, метод вызова события и его реагирование на изменения зависят от ваших потребностей.
Обратите внимание, что этот пример в основном реализует весь подкласс Button; этот подкласс создается как отдельная сборка, а затем создается в качестве пользовательского класса на отдельной странице XAML. Это иллюстрирует концепцию, которую подклассированные элементы управления можно вставить в деревья, состоящие из других элементов управления, и что в этой ситуации пользовательские события этих элементов имеют те же возможности маршрутизации событий, что и любой собственный элемент 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>
События нисходящей маршрутизации создаются аналогичным способом, однако в вызове регистрации для RoutingStrategy задано значение Tunnel. По соглашению события нисходящей маршрутизации в WPF имеют префикс Preview.
Пример функционирования восходящей маршрутизации событий см. в разделе Обработка перенаправленных событий.
См. также
.NET Desktop feedback
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по