2

次のような新しいスレッドで新しい WPF ウィンドウを開いています。

private void OnCreateNewWindow(object sender, RoutedEventArgs e)
{
    Thread thread = new Thread(() =>
    {
        Window1 w = new Window1();
        w.Show();
        Dispatcher.Run(); 
    });

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

問題は、(ウィンドウを表示せずに) Show メソッドでスタックし、Dispatcher.Run に到達しないことです。

スレッドとコール スタックを確認すると、Main と新しいウィンドウ スレッドの 2 つのスレッドが表示されます。ウィンドウ スレッドのコールスタックは、次のフレームにあります。

PresentationCore.dll!System.Windows.Input.CommandManager.FindCommandBinding(オブジェクト送信者、System.Windows.RoutedEventArgs e、System.Windows.Input.ICommand コマンド、bool execute) + 0x1c0 バイト

コードを変更しようとすると、次のメッセージで例外が発生しました。

親の Freezable とは異なるスレッドに属する DependencyObject は使用できません。

これは、凍結されていないメインスレッドが所有するリソースへのアクセスと関係があるように感じます。このアプリには、多くの一般的なスタイルとリソース、ブラシなどがありますが、ウィンドウのコンストラクターに次を配置することにより、この特定のダイアログでそれらを使用しないようにしています。

InheritanceBehavior = InheritanceBehavior.SkipAllNow;

しかし、これでは十分ではないようです。とにかく、許可されていないリソースにアクセスしているようです。

FindCommandBinding を含むフレームは、コマンド バインディングに問題がある可能性があることを示唆しています。ただし、このダイアログにはコマンド バインディングがありません。

ブラシのようなリソースは、リソース ディクショナリで定義されている場合、暗黙的に凍結されていますか? そうでない場合、簡単な方法で明示的にフリーズするにはどうすればよいですか? 何百ものブラシがあります。しかし、これはここでの問題ではないかもしれません。

他のアイデアはありますか?

4

1 に答える 1

-2

winodw オブジェクトの作成と show メソッドの呼び出しを実行するには、Dispatcher.Invoke または BegingInvoke メソッドを使用する必要があります。ワーカー スレッドは、コントロールを呼び出したり、更新したりできません。

Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, () => new Thread(() =>     { Window1 w = new Window1();         w.Show();})
于 2012-08-28T08:09:16.357 に答える