次のような新しいスレッドで新しい 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 を含むフレームは、コマンド バインディングに問題がある可能性があることを示唆しています。ただし、このダイアログにはコマンド バインディングがありません。
ブラシのようなリソースは、リソース ディクショナリで定義されている場合、暗黙的に凍結されていますか? そうでない場合、簡単な方法で明示的にフリーズするにはどうすればよいですか? 何百ものブラシがあります。しかし、これはここでの問題ではないかもしれません。
他のアイデアはありますか?