UIElement.AddHandler(RoutedEvent, Object, Boolean) Метод

Определение

Добавляет обработчик перенаправленного события для указанного перенаправленного события, помещая этот обработчик в коллекцию обработчиков текущего элемента. Укажите значение handledEventsTooкак true , чтобы вызвать предоставленный обработчик, даже если событие обрабатывается в другом месте.

public:
 virtual void AddHandler(RoutedEvent ^ routedEvent, Platform::Object ^ handler, bool handledEventsToo) = AddHandler;
void AddHandler(RoutedEvent const& routedEvent, IInspectable const& handler, bool const& handledEventsToo);
public void AddHandler(RoutedEvent routedEvent, object handler, bool handledEventsToo);
function addHandler(routedEvent, handler, handledEventsToo)
Public Sub AddHandler (routedEvent As RoutedEvent, handler As Object, handledEventsToo As Boolean)

Параметры

routedEvent
RoutedEvent

Идентификатор маршрутизируемого события для обработки.

handler
Object

Platform::Object

IInspectable

Ссылка на реализацию обработчика.

handledEventsToo
Boolean

bool

Значение true для регистрации обработчика таким образом, чтобы он вызывался, даже если перенаправленное событие помечено как обработанное в данных события.

значение false , чтобы зарегистрировать обработчик с условием по умолчанию, что он не будет вызываться, если перенаправленное событие уже помечено как обработанное. Значение по умолчанию — false.

Не следует регулярно запрашивать повторную настройку перенаправленного события, так как это мешает предполагаемому проектированию системы событий среда выполнения Windows для создания элементов управления.

Примеры

В этом примере показан базовый синтаксис для подключения обработчика событий с помощью AddHandler и handledEventsToo как true. В этом случае проводное событие имеет значение Tapped. Типичное место для обработчиков провода — загружено для страницы или OnApplyTemplate для шаблонного элемента управления.

void MyControl::MyPointerPressedHandler(
    winrt::Windows::Foundation::IInspectable const &sender,
    winrt::Windows::UI::Xaml::Input::PointerRoutedEventArgs const& e) {
  // implementation..
}

this->AddHandler(
    winrt::Windows::UI::Xaml::UIElement::PointerPressedEvent(),
    winrt::box_value(winrt::Windows::UI::Xaml::Input::PointerEventHandler(this, &MyControl::MyPointerPressedHandler)),
    true);

// Or passing the handler as a lambda, instead of a member function:
this->AddHandler(
    winrt::Windows::UI::Xaml::UIElement::PointerPressedEvent(),
    winrt::box_value(winrt::Windows::UI::Xaml::Input::PointerEventHandler(
      [=](auto &&, winrt::Windows::UI::Xaml::Input::PointerRoutedEventArgs const &args) {
      // ...
    })),
    true);    
void MainPage::pageRoot_Tapped(Platform::Object^ sender, Windows::UI::Xaml::Input::TappedRoutedEventArgs^ e)
{
     //implementation
}
void MainPage::pageRoot_Loaded(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
     this->AddHandler(UIElement::TappedEvent, ref new TappedEventHandler(this, &MainPage::pageRoot_Tapped), true);
}
private void pageRoot_Tapped(object sender, TappedRoutedEventArgs e)
{
    //implementation
}
private void pageRoot_Loaded_1(object sender, RoutedEventArgs e)
{
    this.AddHandler(UIElement.TappedEvent, new TappedEventHandler(pageRoot_Tapped), true);
}
Private Sub Page_Tapped(sender As Object, e As TappedRoutedEventArgs)
    ' implementation
End Sub
Private Sub Page_Loaded_1(sender As Object, e As RoutedEventArgs)
    Me.AddHandler(UIElement.TappedEvent, New TappedEventHandler(AddressOf Page_Tapped), True)
End Sub

Комментарии

Не пытайтесь использовать AddHandler в качестве общей замены синтаксиса для конкретного языка, который обычно используется для обработчиков событий подключения; Он не будет работать, так как не все события имеют идентификатор, который можно передать в качестве routedEvent. AddHandler предназначен специально для перенаправленных событий и предназначен в основном для конкретного сценария, включенного путем передачи handledEventsToo в качестве true. Дополнительные сведения см. в разделе Общие сведения о событиях и перенаправленных событиях.

Идентификаторы перенаправленных событий

Идентификатор перенаправленного события обычно является статическим свойством UIElement. Например, чтобы добавить обработчик для события KeyUp , передайте KeyUpEvent для этого параметра. Только небольшое количество событий среда выполнения Windows имеет этот идентификатор; только перенаправленные события в UIElement имеют API идентификатора, доступный для этого использования. Как правило, это события, связанные с действиями ввода на различных уровнях: уровень указателя, уровень жестов, уровень манипуляции. Кроме того, таким образом можно обработать события ввода ключей.

Ниже приведен список перенаправленных событий, которые предоставляют идентификатор перенаправленного события и, таким образом, могут обрабатываться обработчиками, зарегистрированными вызовом AddHandler:

Параметр handler

Параметр handler является нетипизированным параметром, но необходимо предоставить новый делегат, который ссылается на метод обработчика, относящееся к нужному событию. Например, при обработке события KeyUp передайте новый экземпляр KeyEventHandler , который ссылается на метод, основанный на этой сигнатуре делегата KeyEventHandler . Для этого требуется разыменовка, а синтаксис разыменования зависит от используемого языка. См. примеры в этом разделе.

Когда следует использовать handledEventsToo

Практическая обработка событий ввода низкого уровня является сложной задачей. Многие элементы управления реализуют поведение, в котором определенное событие помечается как обработанное и заменяется другим более интуитивно понятным событием. Как правило, элемент управления помечает перенаправленное событие как обработанное только в том случае, если для этого есть какое-то намерение. Однако в некоторых сценариях эти конструктивные намерения могут быть не теми, которые требуются для конкретной обработки события ввода. Именно для этих сценариев рекомендуется регистрировать обработчики с помощью handledEventsToo в качестве true . Но вы не должны делать это регулярно. Вызов обработчиков в ответ на все события, даже если они обработаны, усложнит логику обработки событий приложения. Если логика обработчика является существенной, производительность может снизиться. Обработчики следует присоединять к уже обработанным событиям только в том случае, если вы обнаружили, что некоторые элементы управления обрабатывают события, которые необходимо обрабатывать с помощью логики приложения.

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

Применяется к

См. также раздел