Wpf 如何防止新STA线程上的非模式窗口关闭
我想打开一些非模型窗口(WPF),但在这一点上,这必须发生,我在一个非STA线程。因此,我开始一个新的线程,并在那里打开它们。但一旦打开,它们就会再次关闭。(顺便说一句。这些窗口的行为应该独立于主窗口。因此没有设置所有者属性)Wpf 如何防止新STA线程上的非模式窗口关闭,wpf,multithreading,modeless,Wpf,Multithreading,Modeless,我想打开一些非模型窗口(WPF),但在这一点上,这必须发生,我在一个非STA线程。因此,我开始一个新的线程,并在那里打开它们。但一旦打开,它们就会再次关闭。(顺便说一句。这些窗口的行为应该独立于主窗口。因此没有设置所有者属性) private void SomeMethod\u OnA\u NON\u STA\u Thread() { //这里还有其他工作吗 线程ANewThread=新线程(OpenSomeWindows); SetApartmentState(ApartmentState.S
private void SomeMethod\u OnA\u NON\u STA\u Thread()
{
//这里还有其他工作吗
线程ANewThread=新线程(OpenSomeWindows);
SetApartmentState(ApartmentState.STA);
ANewThread.Start();
}
私有void OpenSomeWindows()
{
测试窗口T;
对于(int i=0;i<3;i++)
{
T=新的测试窗口();
T.Show();
}
}
我在这里做错了什么?线程在调用方法结束时终止。将
ANewThread
设置为一个字段(在类/窗体级别声明它)。如果希望windows处于活动状态,则必须在创建它们后启动消息循环(否则线程将退出,而窗口将无法呈现它们自己):
private void OpenSomeWindows()
{
对于(int i=0;i<3;i++)
{
TestWindow T=新的TestWindow();
T.Show();
}
Dispatcher.Run();//Thx!!!!!现在它可以工作了。我再次发现我必须阅读更多关于这个Dispatcher的内容。最后一次迭代:(Application.Current.Dispatcher.Invoke(OpenSomeWindows);)是(IMHO)跨不同线程处理UI的最佳方法,尤其是当您试图快速编写某些内容,并且不想学习或重新学习线程时。我知道这很糟糕,但对于原型和小项目,有时您只需要一些有效的东西,这就是。
private void SomeMethod_OnA_NON_STA_Thread()
{
// some other work here
Thread ANewThread = new Thread(OpenSomeWindows);
ANewThread.SetApartmentState(ApartmentState.STA);
ANewThread.Start();
}
private void OpenSomeWindows()
{
TestWindow T;
for (int i = 0; i < 3; i++)
{
T = new TestWindow();
T.Show();
}
}
private void OpenSomeWindows()
{
for (int i = 0; i < 3; i++)
{
TestWindow T = new TestWindow();
T.Show();
}
Dispatcher.Run(); // <---------
}
List<TestWindow> windows = new List<TestWindow>();
for (int i = 0; i < 3; i++)
{
TestWindow t = new TestWindow();
t.Show();
windows.Add(t);
}
Dispatcher.Run();
private void SomeMethod_OnA_NON_STA_Thread()
{
// some other work here
Application.Current.Dispatcher.Invoke(OpenSomeWindows);
}
private void OpenSomeWindows()
{
for (int i = 0; i < 3; i++)
{
TestWindow T = new TestWindow();
T.Show();
}
// this way, no Dispatcher.Run is needed
}