Wpf 如何在BackgroundWorker中打开任何视图?

Wpf 如何在BackgroundWorker中打开任何视图?,wpf,mvvm,backgroundworker,Wpf,Mvvm,Backgroundworker,在我的桌面应用程序中,我想在BackgroundWorker中打开视图以显示提醒。 但当我试图打开视图时,它会给我以下错误。 “调用线程必须是STA,因为许多UI组件都需要STA。” stackTrace是 at System.Windows.Input.InputManager..ctor() at System.Windows.Input.InputManager.GetCurrentInputManagerImpl() at System.Windows.Input.Keyb

在我的桌面应用程序中,我想在BackgroundWorker中打开视图以显示提醒。 但当我试图打开视图时,它会给我以下错误。 “调用线程必须是STA,因为许多UI组件都需要STA。” stackTrace是

 at System.Windows.Input.InputManager..ctor()
   at System.Windows.Input.InputManager.GetCurrentInputManagerImpl()
   at System.Windows.Input.KeyboardNavigation..ctor()
   at System.Windows.FrameworkElement.FrameworkServices..ctor()
   at System.Windows.FrameworkElement.EnsureFrameworkServices()
   at System.Windows.FrameworkElement..ctor()
   at System.Windows.Controls.Control..ctor()
   at System.Windows.Window..ctor()
   at MahApps.Metro.Controls.MetroWindow..ctor()

任何人都能找到解决方案吗?

您可以这样做:

    private BackgroundWorker _BgWorker;


    public Window1()
    {
        InitializeComponent();

        _BgWorker = new BackgroundWorker();
        _BgWorker.DoWork += new DoWorkEventHandler(bgw_DoWork);
        _BgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
    }

void bgw_DoWork(object sender, DoWorkEventArgs e)
    {
        ///your code to get the data from database...
    }

void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
      //you code to open a view
    }
在Runworker中使用此选项已完成

Thread Messagethread = new Thread(
        new ThreadStart(delegate()
        {
            DispatcherOperation DispacherOP = frmMassenger.Dispatcher
                .BeginInvoke(DispatcherPriority.Normal, new Action(
                    delegate()
                    {
                        frmMassenger.Show();
                    }
            ));
        } ));
        Messagethread.Start();
稍后,使用以下方法将线程与主线程连接:

Thread.join(userthread);

希望这能对您有所帮助。

它的可能副本只在打开视图一次时有效。因为我使用计时器在20秒后运行后台工作程序,它会给我相同的错误@Krishit在frmMassenger处给我NullReference异常。Dispatcher和我可以创建视图的实例,因为我的主要异常发生。@Krishit在替换后工作frmMassenger.Dispatcher到Dispatcher,我可以按计时器间隔打开视图。谢谢你的帮助