Обработка всплывающего события, вызванного модальным диалогом в главном окне - PullRequest
1 голос
/ 19 октября 2011

У меня есть модальное диалоговое окно в моем приложении WPF, которое позволяет пользователю войти на сервер.Диалог просто содержит пользовательский элемент управления, который обрабатывает все элементы входа в систему (пользовательский интерфейс, вызов веб-службы и вызывает перенаправленное событие, когда вызов возвращается).

Все работает хорошо, и я могу обработать свое событие в диалоге (закройте диалоговое окно после успешного входа в систему).Однако я не могу обработать событие в своем основном приложении (я должен обновить пользовательский интерфейс после того, как пользователь вошел в систему).

Как можно перехватить такие перенаправленные события за пределами окна, в котором оно было вызвано (если вообще возможно)?Если это невозможно, как обычно справиться с этим?

Ответы [ 3 ]

2 голосов
/ 20 октября 2011

Пересылаемые события не переходят из новых окон владельцам.RoutedCommands также не будут работать напрямую.Но Binding s может работать!

Когда вы устанавливаете childWindow.OwnerWindow = Application.Current.MainWindow, childWindow логически подключается к 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>
1 голос
/ 19 октября 2011

Я не понимаю, как можно автоматически перенаправить перенаправленное событие между разными окнами, поскольку они не находятся в одном логическом дереве.Способ, которым сложные приложения пользовательского интерфейса имеют тенденцию обрабатывать межвидовое взаимодействие такого рода, заключается в некоторой реализации шаблона EventAggregator, поэтому, если вы обнаружите, что вам нужно много обмена данными между представлениями, то это может быть гораздо более чистый способ решенияс такими сценариями.Платформа Prism содержит реализацию EventAggregator, но рукописная для простого сценария не должна быть слишком сложной, если требуется.

1 голос
/ 19 октября 2011

Пересылаемые события не будут переходить из одного окна в другое.

Определите общедоступное событие CLR в вашем дочернем окне.Когда главное окно создает экземпляр дочернего объекта, оно должно подключить обработчик для этого события, прежде чем показывать дочерний элемент.Тогда ребенку просто нужно поднять это событие в подходящее время.

...