1

メイン UI スレッドとは別のスレッドでウィンドウを起動する必要があります。それは理想的ではありません、私はそれが正常ではないことを知っています.

新しいウィンドウは次のように起動されます。

private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
        {
            var thread = new Thread(() =>
                {
                    var w = new ScrollingBanner(300,70,0,0);
                    w.Show();
                    w.Name = "BannerThread";

                    w.Closed += (sender2, e2) => w.Dispatcher.InvokeShutdown();

                    Dispatcher.Run();
                });               
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();

        }

これにより、ウィンドウが起動し、必要なアクションが実行されます。

この (スレッド化された) UI のウィンドウのコントロールは、次のように、ウィンドウの後ろのコードでリッスンしているイベントを呼び出します。

 private void ContentTicker_OnScrollComplete(object sender, EventArgs e)
    {
        Debug.WriteLine("Scroller Ended");

        try
        {
            if (CheckAccess())
            {
                sliderText.Text = "Updated Text";
            }
            else
            {
                Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                                                       new Action(() => sliderText.Text = "Updated Text"));
            }
        }
        catch (Exception ex)
        {
            //breakpoint
        }        
    }

ContentTicker_OnScrollComplete は、コントロールが実行されるバックグラウンド スレッドから呼び出されます。

例外が発生しました。別のスレッドがコントロールを所有しています。しかし、私が知る限り、正しいスレッドでアクションを実行するために Dispatcher を呼び出しています。(これはすべてメイン UI スレッドで行うと機能します)

正しいスレッドで「sliderText」を更新するにはどうすればよいですか?

ありがとう

4

1 に答える 1

3

これを置き換えます:

Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                                                   new Action(() => sliderText.Text = "Updated Text"))

このため:

Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                                                   new Action(() => sliderText.Text = "Updated Text"))

Application.Current.Dispatcher「セカンダリ」ディスパッチャーではなく、「メイン」ディスパッチャーを返すためです。

于 2013-08-29T22:42:28.190 に答える