Вызов события в родительском окне из пользовательского элемента управления в .NET C # - PullRequest
14 голосов
/ 18 июня 2010

Название в значительной степени объясняет вопрос. У меня пользовательский элемент управления загружен в главное окно при первом запуске приложения. Что я хочу сделать, это вызвать событие в родительском окне при нажатии кнопки на пользовательском элементе управления, так как я могу вызвать родительское событие с button1_Click на пользовательском элементе управления?

Ответы [ 2 ]

44 голосов
/ 07 августа 2013

Эта проблема, кажется, нигде не описана полностью сквозной: приведенная выше ссылка не полное объяснение того, как определить, поднять и перехватить событие из UserControl в родительское окно. Для некоторых это может быть очевидно, но мне потребовалась минута, чтобы соединить точки, поэтому я поделюсь своими выводами. Да, способ сделать это через Custom RoutedEvent, установленный в RoutingStrategy.Bubble, но это еще не все.


В этом примере у меня есть UserControl с именем ServerConfigs, в котором есть кнопка Сохранить. Когда пользователь нажимает кнопку «Сохранить», я хочу кнопку в родительском окне, которая содержит UserControl для включения другой кнопки, кнопка называется btn_synchronize.

В приведенном ниже коде UserControl определите следующее согласно приведенной выше ссылке RoutedEvent.

public partial class ServerConfigs : UserControl
{

    // Create RoutedEvent
    // This creates a static property on the UserControl, SettingsConfirmedEvent, which 
    // will be used by the Window, or any control up the Visual Tree, that wants to 
    // handle the event. This is the Custom Routed Event for more info on the 
    // RegisterRoutedEvent method
    // https://msdn.microsoft.com/en-us/library/ms597876(v=vs.100).aspx

    public static readonly RoutedEvent SettingConfirmedEvent =
        EventManager.RegisterRoutedEvent("SettingConfirmedEvent", RoutingStrategy.Bubble,
        typeof(RoutedEventHandler), typeof(ServerConfigs));

    // Create RoutedEventHandler
    // This adds the Custom Routed Event to the WPF Event System and allows it to be 
    // accessed as a property from within xaml if you so desire

    public event RoutedEventHandler SettingConfirmed
    {
        add { AddHandler(SettingConfirmedEvent, value); }
        remove { RemoveHandler(SettingConfirmedEvent, value); }
    }
    ....

    // When the Save button on the User Control is clicked, use RaiseEvent to fire the 
    // Custom Routed Event

    private void btnSave_Click(object sender, RoutedEventArgs e)
    {
    ....
        // Raise the custom routed event, this fires the event from the UserControl
        RaiseEvent(new RoutedEventArgs(ServerConfigs.SettingConfirmedEvent));
    ....
    }
}

Есть пример реализации, на котором заканчивается вышеприведенный урок. Так как же поймать событие в окне и обработать его?

Из файла window.xaml так можно использовать Custom RoutedEventHandler, определенный в пользовательском элементе управления. Это в точности как button.click и т. Д.

<Window>
....
<uc1:ServerConfigs SettingConfirmed="Window_UserControl_SettingConfirmedEventHandlerMethod" 
                   x:Name="ucServerConfigs" ></uc1:ServerConfigs>
...
</Window>

ИЛИ в коде окна позади, вы можете установить EventHandler через AddHandler, обычно в конструкторе:

public Window()
{
    InitializeComponent();
    // Register the Bubble Event Handler 
    AddHandler(ServerConfigs.SettingConfirmedEvent, 
        new RoutedEventHandler(Window_UserControl_SettingConfirmedEventHandlerMethod));
}

private void Window_UserControl_SettingConfirmedEventHandlerMethod(object sender,
              RoutedEventArgs e)
{
    btn_synchronize.IsEnabled = true;
}
3 голосов
/ 18 июня 2010

Вам нужна ссылка RoutedEvent

"Маршрутизируемые события - это события, которые перемещаются вверх или вниз по визуальному дереву в соответствии с их RoutingStrategy. Стратегия маршрутизации может быть пузырьковой, туннельной или прямой. Вы можете подключить обработчики событий к элементу, который вызывает событие, а также к другим элементам. выше или ниже, используя синтаксис присоединенного события: Button.Click = "Button_Click". "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...