1

私のデスクトップ アプリケーションでは、BackgroundWorker でビューを開いてリマインダーを表示したいと考えています。しかし、ビューを開こうとすると、次のエラーが表示されます。 「多くの 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()

誰でも解決できますか?

4

1 に答える 1

0

次の方法でこれを行うことができます。

    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);

これがあなたを助けることを願っています。

于 2013-06-26T09:37:38.547 に答える