Практическое руководство. Создание пользовательских перенаправленных событий
Пользовательское событие поддерживало маршрутизацию событий, необходимо зарегистрировать RoutedEvent с помощью RegisterRoutedEvent метод. В этом примере демонстрируются основные принципы создания пользовательских перенаправленных событий.
Пример
Как показано в следующем примере сначала зарегистрировать RoutedEvent с помощью RegisterRoutedEvent метод. По соглашению RoutedEvent имя статического поля должно заканчиваться суффиксом событий. В этом примере событие называется Tap
и стратегия маршрутизации события – Bubble. После вызова регистрации можно предоставить для этого события методы доступа к событию добавления и удаления CLR.
Обратите внимание, что несмотря на то что в этом примере событие вызывается виртуальным методом OnTap
, метод вызова события и его реагирование на изменения зависят от ваших потребностей.
Обратите внимание, что по сути, в этом примере реализуется весь подкласс Button; Этот подкласс создается в виде отдельной сборки, а затем создается экземпляр в виде пользовательского класса на отдельном XAML страницы. Это призвано проиллюстрировать тот факт, что производные от классов элементы управления можно вставлять в деревья, состоящие из других элементов управления, и что в этой ситуации пользовательские события в этих элементах управления имеют те же функции маршрутизации событий, что и собственный элемент Windows Presentation Foundation (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();
}
}
<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.
Пример функционирования восходящей маршрутизации событий см. в разделе Обработка перенаправленных событий.