Поделиться через


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

В этом примере описаны принципы действия всплывающих событий и способы написания обработчика, который может обрабатывать данные перенаправленных событий.

Пример

В Windows Presentation Foundation (WPF) элементы располагаются в структуре дерева элементов. Родительский элемент может участвовать в обработке событий, которые изначально вызываются его дочерними элементами в дереве элементов. Это возможно благодаря маршрутизации событий.

Перенаправленные события обычно следуют по одному из двух вариантов маршрутизации: восходящей или нисходящей. В этом примере основное внимание уделяется всплывающему событию и используется событие ButtonBase.Click, чтобы показать, как работает маршрутизация.

В следующем примере создаются два элемента управления Button и используется синтаксис атрибутов XAML для присоединения обработчика событий к общему родительскому элементу, которым в этом примере является элемент управления StackPanel. Вместо присоединения отдельных обработчиков событий для каждого дочернего элемента Button, в примере используется синтаксис атрибута для присоединения обработчика событий к родительскому элементу StackPanel. Этот шаблон обработки событий показывает, как использовать маршрутизирование событий для снижения числа элементов, к которым присоединен обработчик. Все всплывающие события для каждого маршрута Button направляются через родительский элемент.

Обратите внимание, что на родительском элементе StackPanel имя события Click, указанное в качестве атрибута, частично определяется с помощью указания класса Button. Класс Button является производным от класса ButtonBase, который содержит событие Click в своем списке членов. Этот метод частичного уточнения для присоединения обработчика событий необходим, если обрабатываемое событие не существует в списке членов элемента, к которому присоединен обработчик перенаправленных событий.

<StackPanel
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.RoutedEventHandle"
  Name="dpanel"
  Button.Click="HandleClick"
>
  <StackPanel.Resources>
      <Style TargetType="{x:Type Button}">
        <Setter Property="Height" Value="20"/>
        <Setter Property="Width" Value="250"/>
        <Setter Property="HorizontalAlignment" Value="Left"/>
      </Style>
  </StackPanel.Resources>
  <Button Name="Button1">Item 1</Button>
  <Button Name="Button2">Item 2</Button>
  <TextBlock Name="results"/>
</StackPanel>

В следующем примере показана обработка события Click. В примере сообщается, какой элемент обрабатывает событие и какой элемент вызывает событие. Обработчик событий выполняется, когда пользователь нажимает одну из кнопок.

Private eventstr As New Text.StringBuilder()

Private Sub HandleClick(ByVal sender As Object, ByVal args As RoutedEventArgs)
    ' Get the element that handled the event.
    Dim fe As FrameworkElement = DirectCast(sender, FrameworkElement)
    eventstr.Append("Event handled by element named ")
    eventstr.Append(fe.Name)
    eventstr.Append(vbLf)

    ' Get the element that raised the event. 
    Dim fe2 As FrameworkElement = DirectCast(args.Source, FrameworkElement)
    eventstr.Append("Event originated from source element of type ")
    eventstr.Append(args.Source.[GetType]().ToString())
    eventstr.Append(" with Name ")
    eventstr.Append(fe2.Name)
    eventstr.Append(vbLf)

    ' Get the routing strategy.
    eventstr.Append("Event used routing strategy ")
    eventstr.Append(args.RoutedEvent.RoutingStrategy)
    eventstr.Append(vbLf)

    results.Text = eventstr.ToString()
End Sub
public partial class RoutedEventHandle : StackPanel
{
    StringBuilder eventstr = new StringBuilder();
    void HandleClick(object sender, RoutedEventArgs args)
    {
        // Get the element that handled the event.
        FrameworkElement fe = (FrameworkElement)sender;
        eventstr.Append("Event handled by element named ");
        eventstr.Append(fe.Name);
        eventstr.Append("\n");

        // Get the element that raised the event. 
        FrameworkElement fe2 = (FrameworkElement)args.Source;
        eventstr.Append("Event originated from source element of type ");
        eventstr.Append(args.Source.GetType().ToString());
        eventstr.Append(" with Name ");
        eventstr.Append(fe2.Name);
        eventstr.Append("\n");

        // Get the routing strategy.
        eventstr.Append("Event used routing strategy ");
        eventstr.Append(args.RoutedEvent.RoutingStrategy);
        eventstr.Append("\n");

        results.Text = eventstr.ToString();
    }
}

См. также

Ссылки

RoutedEvent

Основные понятия

Общие сведения о входных данных

Общие сведения о перенаправленных событиях

Подробное описание синтаксиса XAML

Другие ресурсы

Разделы руководства, посвященные событиям

Журнал изменений

Дата

Журнал

Причина

Июль 2010

Добавлен пример обработчика событий.

Обратная связь от клиента.