Вопрос о событии WPF Custom Routed - PullRequest
7 голосов
/ 10 ноября 2008

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

Например. Я хотел бы вызвать пользовательское всплывающее событие из обработчика OnFocus для кнопки и текстового поля.

1 Ответ

8 голосов
/ 10 ноября 2008

Прежде всего позвольте мне сказать, что ваш вопрос не проясняет, что вы не хотите использовать существующее UIElement.GotFocusEvent , но я предполагаю, что вы знаете об этом и у вас есть причины не использую его.

Вы всегда можете зарегистрировать пользовательское событие в статическом классе и вызывать его в любом месте. Класс Keyboard работает со всеми своими событиями (например, 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));
}
...