Маршрутизация ключевых событий на другой элемент управления

Есть ли стандартный способ перенаправить все ключевые события из элемента управления A в другой элемент управления B? Я хочу, чтобы фокус клавиатуры по-прежнему был на A, однако обработчик событий A запускал бы все обработчики событий B для ключевых событий.

Изменить: Уточнение: недостаточно вызвать определенный обработчик событий, который я написал для B. Мне нужно имитировать реальное событие. Так, например, я хочу, чтобы, если ключ отправляется на TextBox, он был записан на TextBox. Решение, приведенное ниже, этого не делает (не говоря уже о том, что если к B добавить новые обработчики событий, оно полностью выйдет из строя).

Я знаю, что WPF различает логический фокус и фокус клавиатуры, но мне нужно, чтобы оба фокуса оставались на элементе управления A, но в некоторых случаях направляли его входящее событие на другие элементы управления.


person Elazar Leibovich    schedule 14.09.2009    source источник
comment
Разве вы не можете просто заставить свои ключевые события для элемента управления A выполнять некоторую проверку и, при необходимости, вызывать ключевые события для элемента управления B?   -  person Relster    schedule 14.09.2009
comment
Нет! Это не вызовет событие, а просто вызовет одну конкретную функцию, которая когда-то была связана с событием нажатия кнопки. Я хочу имитировать фактическое событие, отправляемое WPF.   -  person Elazar Leibovich    schedule 15.09.2009
comment
@Elazar - Смотрите мое редактирование. Будет ли работать метод RaiseEvent()?   -  person Donut    schedule 15.09.2009


Ответы (1)


Не могли бы вы сделать что-то подобное?

  private void button1_Click(object sender, RoutedEventArgs e)
  {
     // Check if the event needs to be passed to button2's handler
     if (conditionIsMet)
     {
        // Send the event to button2
        button2.RaiseEvent(e);
     }
     else
     {
        // button1's "Click" code
     }
  }

  private void button2_Click(object sender, RoutedEventArgs e)
  {
     // button2's "Click" code
  }

Изменить: код изменен, чтобы использовать метод RaiseEvent() для программного вызова определенного события, а не просто вызывать обработчик события для button2.

person Donut    schedule 14.09.2009
comment
Нет! Это не вызовет событие, а просто вызовет одну конкретную функцию, которая когда-то была связана с событием нажатия кнопки. Я хочу имитировать фактическое событие, отправляемое WPF. - person Elazar Leibovich; 15.09.2009
comment
Это то, что я искал! - person Elazar Leibovich; 15.09.2009
comment
Интересно, почему это называется повышением событий. Я искал событие пожара и вызывал событие и триггерное событие, но безрезультатно... - person Elazar Leibovich; 15.09.2009