#c# #wpf #events #routed-events
#c# #wpf #Мероприятия #перенаправленные события
Вопрос:
В моем приложении WPF есть модальный диалог, который позволяет пользователю входить на сервер. Диалоговое окно просто содержит пользовательский элемент управления, который обрабатывает все элементы входа (пользовательский интерфейс, вызов веб-службы и вызов маршрутизируемого события при возврате вызова).
Все работает хорошо, и я могу обработать свое событие в диалоговом окне (закройте диалоговое окно при успешном входе в систему). Однако я не могу обработать событие в своем основном приложении (я должен обновить пользовательский интерфейс после входа пользователя в систему).
Как можно перехватывать такие маршрутизируемые события за пределами окна, в котором оно было вызвано (если это вообще возможно)? Если это невозможно, каков обычный способ справиться с этим?
Ответ №1:
Перенаправленные события не передаются из новых окон владельцам. RoutedCommands также не будут работать напрямую. Но Binding
s может работать!
При установке childWindow.OwnerWindow = Application.Current.MainWindow
дочернее окно логически подключается к главному окну через его OwnerWindow
свойство.
Вы могли бы использовать это для привязки к OwnerWindow
команде ViewModel и ее выполнения.
<Window x:Class="...ChildWindow"
... >
<Button Command="{Binding Path=OwnerWindow.DataContext.SaveCommand,
RelativeSource={RelativeSource
AncestorType={x:Type Window}}}"
Content="Execute Owner's Save Command" />
</Window>
Ответ №2:
Маршрутизируемые события не будут переходить из одного окна в другое.
Определите общедоступное событие CLR в вашем дочернем окне. Когда главное окно создает экземпляр дочернего элемента, оно должно подключить обработчик для этого события, прежде чем показывать дочерний элемент. Затем дочернему элементу просто нужно вызвать это событие в соответствующее время.
Ответ №3:
Я не понимаю, как вы могли бы автоматически переносить маршрутизируемое событие между разными окнами, поскольку они не находятся в одном логическом дереве. Способ, которым сложные приложения пользовательского интерфейса, как правило, обрабатывают такого рода взаимодействие между представлениями, заключается в некоторой реализации EventAggregator
шаблона, поэтому, если вы обнаружите, что вам нужно много общения между представлениями, это может быть гораздо более чистым способом справиться с такого рода сценариями. Платформа Prism содержит EventAggregator
реализацию, но написанная вручную для простого сценария, не должна быть слишком сложной, если требуется.