Thread.Join WPF中的UI块

时间:2013-12-02 17:48:27

标签: c# wpf multithreading

我创建了一个自定义MessageWindow,以便摆脱旧版本并将自己的风格放在上面...

我的问题是,当我点击一个按钮打开自定义MessageWindow时,它并没有真正阻止我的用户界面。

public static void Show(string caption, string message)
{
    Thread thread = new Thread(() =>
    {
        MessageWindow window = new MessageWindow(caption, message);
        window.ShowDialog();
    });
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
    thread.Join();
}

我认为thread.Join将阻止父线程,直到新线程消失,但不知何故,UI部分处于活动状态。我没有看到动画,也没有能够移动窗口但是当我在MessageWindow打开时单击被阻止线程上的按钮时,它仍然接受点击并在我关闭{{1}后执行它} thread。

当消息窗口打开时,有没有办法禁用消息泵或阻止/锁定任何线程/ UI?

2 个答案:

答案 0 :(得分:1)

您不应为其他窗口创建新线程。使用WPF时,所有UI都应该在同一个线程上运行。

当您想要执行与UI无关并且不想阻止UI的内容时创建新线程。

答案 1 :(得分:0)

如果您想在MessageWindow可见时阻止用户与主窗口进行互动,只需将Owner的{​​{1}}设置为应用程序的主窗口即可。然后从UI线程调用MessageWindow,如果您调用ShowDialog(),行为应该与之相当。

请勿使用单独的线程或尝试手动阻止消息泵。