Вы можете использовать Thread
s и Thread.join()
с Handler
s в качестве опции.
цитата из: https://docs.oracle.com/javase/tutorial/essential/concurrency/join.html
Метод соединения позволяет Поток ждать завершения другого. Если t является объектом Thread, поток которого в данный момент выполняется,
t.join (); заставляет текущий поток приостанавливать выполнение, пока поток t не завершится. Перегрузки соединения позволяют программисту указывать период ожидания. Однако, как и в спящем режиме, объединение зависит от ОС для синхронизации, поэтому не следует предполагать, что объединение будет ждать ровно столько времени, сколько вы укажете.
Как и sleep, join реагирует на прерывание путем выхода с InterruptedException.
РЕДАКТИРОВАТЬ : Вы также должны проверить мою диспетчер событий Гист. Вам может понравиться это.
Проблема в том, что регионы ищут в визуальном дереве присоединенное свойство RegionManager, а затем регистрируются в этом диспетчере. В главном окне это нормально, но в дочернем окне этого не происходит.
В Bootstrapper после создания оболочки выполняется следующий код.
RegionManager.SetRegionManager(shell, this.Container.Resolve<IRegionManager>());
RegionManager.UpdateRegions();
Чтобы региональный менеджер работал с вашим дочерним элементом window делает то же самое сразу после того, как вы создали окно.
EDIT
Чтобы установить имя региона для элемента управления, вы также устанавливаете присоединенное свойство RegionManager, например ...
RegionManager.SetRegionName(control, "MyRegion");
Однако вы можно сделать это и в xaml. Причина, по которой ваши регионы в отдельном окне не работают, заключается в том, что RegionManager должен быть установлен в базовом окне, как я показал выше.
Я нашел кое-что, что почти работает. Я уверен, что если бы я мог привязать активное представление региона к свойству contentContol content, тогда это сработало бы, но мне это еще не удалось.
IRegionManager MyRegionManager = container.Resolve<IRegionManager>();
SingleActiveRegion newRegion = new SingleActiveRegion();
MyRegionManager.Regions.Add("WizardSteps", newRegion);
//Binding
Binding myBinding = new Binding("ActiveViews");
myBinding.Source = newRegion;
view.stepControl.SetBinding(ContentControl.ContentProperty, myBinding);
На самом деле это довольно просто.
В вашем всплывающем окне xaml добавьте regionname, как вы это делаете в оболочке. Затем в конструкторе всплывающих окон добавьте следующий вызов:
public Popup(IRegionManager regionManager)
{
InitializeComponent();
RegionManager.SetRegionManager(this,regionManager);
}
Это работает у меня в Prism v.1 - не должно быть слишком много отличий в более поздних версиях.