我在this这样的新线程中打开了新的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-method上停留(没有显示窗口),也从未到达Dispatcher.Run。
当检查线程和调用堆栈时,我可以看到两个线程,Main和我的新窗口线程。窗口线程的callstack位于以下帧:
PresentationCore.dll中!System.Windows.Input.CommandManager.FindCommandBinding(对象 sender,System.Windows.RoutedEventArgs e, System.Windows.Input.ICommand命令,bool执行)+ 0x1c0字节
尝试修改代码时,我曾设法通过以下消息获得异常:
不能使用属于不同线程的DependencyObject 它的父母Freezable。
我感觉这与访问未被冻结的主线程拥有的资源有关。在这个应用程序中,我有很多通用的样式和资源,画笔等,但我试图通过将以下内容放在窗口的构造函数中来避免在这个特定的对话框中使用它们:
InheritanceBehavior = InheritanceBehavior.SkipAllNow;
但这似乎还不够。不知何故,似乎无论如何都会访问一些不允许的资源。
使用FindCommandBinding的框架暗示它可能是命令绑定的问题。但是这个对话框没有命令绑定。
如果在资源字典中定义资源,那么资源是否会隐式冻结?如果没有,我如何以一种简单的方式明确冻结它们?有数百个画笔。但这可能不是问题所在。
还有其他想法吗?
答案 0 :(得分:-2)
您需要使用Dispatcher.Invoke或BegingInvoke方法来执行winodw对象的创建并调用show方法。工作线程无法调用或更新控件。
Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, () => new Thread(() => { Window1 w = new Window1(); w.Show();})