在后台加载另一个窗口;渲染时,关闭父窗口
本文关键字:窗口 后台 加载 另一个 | 更新日期: 2023-09-27 18:22:15
我一直试图在一个窗口的后台加载另一个窗口;在我的情况下,父窗口充当启动屏幕。
InitWindow I = null;
public InitWindow()
{
InitializeComponent();
I = this;
Thread T = new Thread(() =>
{
MainWindow M = new MainWindow();
M.Show();
M.ContentRendered += M_ContentRendered;
System.Windows.Threading.Dispatcher.Run();
M.Closed += (s, e) => M.Dispatcher.InvokeShutdown();
}) { IsBackground = true, Priority = ThreadPriority.Lowest };
T.SetApartmentState(ApartmentState.STA);
T.Start();
}
void M_ContentRendered(object sender, EventArgs e)
{
I.Close();
}
其他一切都很好,但它在以下位置引发无效操作异常:
I.Close();
调用线程无法访问此对象,因为其他线程拥有它。
1) 如何切换/同步线程?
2) 有更好的解决方法吗?
将代码更改为:
InitWindow I = null;
Thread C = null;
public InitWindow()
{
InitializeComponent();
I = this;
C = Thread.CurrentThread;
Thread T = new Thread(() =>
{
MainWindow M = new MainWindow();
M.Show();
M.ContentRendered += M_ContentRendered;
System.Windows.Threading.Dispatcher.Run();
M.Closed += (s, e) => M.Dispatcher.InvokeShutdown();
}) { IsBackground = true, Priority = ThreadPriority.Lowest };
T.SetApartmentState(ApartmentState.STA);
T.Start();
}
void M_ContentRendered(object sender, EventArgs e)
{
// Making the parent thread background
C.IsBackground = true;
// foreground the current thread
Thread.CurrentThread.IsBackground = false;
// Abort the parent thread
C.Abort();
}
目前运行良好,但我认为这不是一个可靠的解决方案。