Эта проблема, кажется, нигде не описана полностью сквозной: приведенная выше ссылка не полное объяснение того, как определить, поднять и перехватить событие из 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;
}