Show / Hide Table of Contents

Практическое руководство. Создание пользовательских перенаправленных событий

Пользовательское событие поддерживало маршрутизацию событий, необходимо зарегистрировать 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.

Пример функционирования восходящей маршрутизации событий см. в разделе Обработка перенаправленных событий.

См. также

  • Общие сведения о перенаправленных событиях
  • Общие сведения о входных данных
  • Общие сведения о разработке элементов управления
Back to top Неофициальная документация по .NET на русском языке. Лицензия: CC-BY 4.0. Основано на документации по .NET с Microsoft Docs
Generated by DocFX