gpt4 book ai didi

wpf - 如何防止新的STA线程上的非模式窗口关闭

转载 作者:行者123 更新时间:2023-12-03 13:21:54 26 4
gpt4 key购买 nike

我想打开一些非模型窗口(WPF),但是在这种情况下,我必须处于非STA线程上。因此,我启动了一个新线程并在那里打开它们。但是,一旦打开,它们就会再次关闭。 (顺便说一句。这些窗口的行为应独立于主窗口。因此,未设置所有者属性)

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();
}
}

我在这里做错了什么?

最佳答案

如果要让窗口保持 Activity 状态,则必须在创建窗口后启动消息循环(否则,线程将退出,并且窗口没有机会渲染自己):

private void OpenSomeWindows()
{
for (int i = 0; i < 3; i++)
{
TestWindow T = new TestWindow();
T.Show();
}
Dispatcher.Run(); // <---------
}

(在主线程中,消息循环是由框架为您创建的。)

附注:我不确定是否可以对 window 进行垃圾收集,因此我会将对它们的引用保存在某个地方:
List<TestWindow> windows = new List<TestWindow>();
for (int i = 0; i < 3; i++)
{
TestWindow t = new TestWindow();
t.Show();
windows.Add(t);
}
Dispatcher.Run();

P.P.S .:也许您希望Windows在主线程中运行?实际上,您可以执行此操作。您只需要以下内容:
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
}

关于wpf - 如何防止新的STA线程上的非模式窗口关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6203677/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com