Вопрос о событии WPF Custom Routed
-
07-07-2019 - |
Вопрос
Как заставить два несвязанных элемента управления вызывать одно и то же пользовательское событие?Во всех примерах, которые я видел до сих пор, событие определено в одном элементе управления. Должен ли я использовать другой подход?
Например.Я хотел бы вызвать пользовательское событие всплывания из обработчика OnFocus для кнопки и текстового поля.
Решение
Прежде всего позвольте мне сказать, что ваш вопрос не дает понять, что вы не хотите использовать существующий UIElement.GotFocusEvent, но я предполагаю, что вы знаете об этом и у вас есть причины не использовать его.
Вы всегда можете зарегистрировать собственное событие в статическом классе и вызывать его где угодно.А Класс клавиатуры делает со всеми своими событиями (например. Keyboard.KeyDownEvent).
public static class RoutedEventUtility
{
public static readonly RoutedEvent MyCustomEvent = EventManager.RegisterRoutedEvent("MyCustomEvent", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(RoutedEventUtility));
}
Вы вызываете это событие так же, как и любое другое RoutedEvent.
RoutedEventArgs args = new RoutedEventArgs(RoutedEventUtility.MyCustomEvent);
RaiseEvent(args);
Если вы хотите, чтобы другой класс владел событием как общедоступным полем, вам нужно будет добавить владельца.
public class MyCustomControl : Control
{
public static readonly RoutedEvent MyCustomEvent = RoutedEventUtility.MyCustomEvent.AddOwner(typeof(MyCustomControl));
}