我的应用程序中有一个页面显示,我想执行一个可能长时间运行的后台操作。在此操作进行期间,应呈现另一个 View ,一旦完成,该区域应导航回其先前的 View 。如果出现任何问题,导航应该转到其他 View 。
为了说明这一点,假设我有一些类,并在其构造函数中设置了一个 ICommand:
SomeAction = new DelegateCommand(() =>
{
_regionManager.RequestNavigate("MyTarget", nameof(SomeProgressPage));
Task.Run(() =>
{
DoSomeWork();
});
});
任务本身与可能长时间运行的事物有关;一旦完成,它应该导航到一个有条件的目的地。
private void SomeWork()
{
try
{
// Do Work
// ...
// Return when done.
_regionManager.RequestNavigate("MyTarget", nameof(SomePage));
}
catch
{
_regionManager.RequestNavigate("MyTarget", nameof(SomeErrorPage));
}
}
虽然我可以在调试中逐步解决这个问题,并且在途中没有遇到任何错误,但从另一个线程调用时,RequestNavigation 似乎没有任何效果,也没有抛出异常。我导航到“SomeProgressPage”,任务确实运行,并且根据其结果,执行可以跟随到 RequestNavigation - 然后什么都没有。
我还尝试通过事件执行此导航,例如:
eventAggregator.GetEvent<NavigationRequestEvent>().Subscribe(x =>
{
regionManager.RequestNavigate(x.Target, x.Destination, x.Parameters);
}, ThreadOption.UIThread);
在这种情况下,发布事件时甚至不会调用订阅者。
我一直无法从我的谷歌搜索中找到任何可靠的资源来处理这个问题,并且没有连接到源代码并通过 Prism 进行调试;如何在使用 Prism 时最好地实现此类功能?
最佳答案
如果你想从另一个线程打开一个新窗口,你需要调用 Current dispatcher。
private void SomeWork()
{
try
{
// Do Work
// ...
// Return when done.
App.Current.Dispatcher.Invoke((Action)delegate
{
_regionManager.RequestNavigate("MyTarget", nameof(SomePage));
});
}
catch
{
App.Current.Dispatcher.Invoke((Action)delegate
{
_regionManager.RequestNavigate("MyTarget", nameof(SomeErrorPage));
});
}
}
关于c# - 从后台操作导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37208453/