WPF - 设置窗口所有者

时间:2017-02-14 11:43:33

标签: wpf

我有以下情况:

  • 显示一个窗口,其中的引用存储在实用程序类中。
  • 稍后,模式对话框需要在上面那个窗口出现;所以我正在做以下事情:

    OptionalMessageBox message = new OptionalMessageBox(title, errorMessage.ToString(), MessageImage.Warning);
    if (UIUtilities.TopWindow != null)
    {
        UIUtilities.TopWindow.Dispatcher.Invoke(() => message.Owner = UIUtilities.TopWindow);
        UIUtilities.TopWindow.Dispatcher.Invoke(() => message.ShowDialog());
    }
    else
    {
        message.ShowDialog();
    }
    

然而,这是经典的'调用线程无法访问此对象,因为另一个线程拥有它'虽然我不明白为什么我使用TopWindow变量的调度程序。作为一个注释(并且出于绝望),我尝试将调用放在我刚刚创建的消息变量上 - 这也没有用,但我没想到会成为问题,因为我现在如何拥有它如果我刚刚做完了!

非常感谢任何建议。

2 个答案:

答案 0 :(得分:0)

试试这个:

 if (UIUtilities.TopWindow != null)
        {
            UIUtilities.TopWindow.Dispatcher.Invoke(() => {

                OptionalMessageBox message = new OptionalMessageBox(title, errorMessage.ToString(), MessageImage.Warning);
                message.Owner = UIUtilities.TopWindow;
                message.ShowDialog();

            });
        }
else
{
    OptionalMessageBox message = new OptionalMessageBox(title, errorMessage.ToString(), MessageImage.Warning);
                message.ShowDialog();
}

答案 1 :(得分:0)

您可以使用此

App.Current.Dispatcher.Invoke(() => {
OptionalMessageBox message = new OptionalMessageBox(title, errorMessage.ToString(), MessageImage.Warning);
message.Owner = App.Current.MainWindow;
message.ShowDialog();
});