2008-11-10 9 views
7

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

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

ответ

8

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

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

Спасибо. Извините, да, правильное предположение о UIElement.GotFocusEvent. – MJS 2008-11-10 20:22:00