c# - 从后台操作导航

标签 c# wpf prism

我的应用程序中有一个页面显示,我想执行一个可能长时间运行的后台操作。在此操作进行期间,应呈现另一个 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/

相关文章:

c# - (.1f + .2f ==。3f)!=(.1f + .2f).Equals(.3f)为什么呢?

c# - 路径是目录吗?

c# - dotnet ef 数据库更新无法加载文件或程序集“Microsoft.Extensions.FileProviders.Abstractions”

c# - 将列表绑定(bind)到 wpf 中的 listboxitem

wpf - 如何在 mvvm 中重置 View 模型

WPF PRISM - 在不解析实例的情况下向区域注册 View

c# - 禁用收集

c# - 如何在 WPF 4.5 中实现 INotifyDataErrorInfo?

c# - 使用MVVM从页面的OnNavigate调用Viewmodel中存在的方法

c# - 对 INavigationService 类型的引用声称它是在 Prism 中定义的,但找不到