【问题标题】:WPF - Set Window OwnerWPF - 设置窗口所有者
【发布时间】:2017-02-14 11:43:32
【问题描述】:

我有以下情况:

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

    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 变量的调度程序。作为注释(出于绝望),我尝试将调用放在我刚刚创建的消息变量上 - 这也不起作用,但我没想到这是问题,因为如果我现在拥有它成功了!

任何建议将不胜感激。

【问题讨论】:

    标签: wpf


    【解决方案1】:

    试试这个:

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

    【讨论】:

      【解决方案2】:

      你可以用这个

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

      【讨论】:

      • 谢谢,但这需要能够访问应用程序 - 另一个答案删除了该要求。
      • 您可以随时访问应用程序。请注意,“Application.Current.Dispatcher 最有可能 ReferenceEquals() 几乎总是 Window.Dispatcher,这意味着它们是相同的”请参阅 stackoverflow.com/questions/28703717/…
      • 另请注意,在另一个答案中,如果 TopWindow 为空,它将不会显示消息。这不是问题中所问的。
      • 我可以访问应用程序;但是,如果 TopWindow 为空,那么我仍然会在当前窗口后面收到消息,因此我需要使用 TopMost(不理想,但我可以快速做到最好)。我的主要目标是在我的应用程序顶部制作对话框。我现在能想到的唯一方法是有一个堆栈,每次打开一个窗口时我都会将每个窗口推送到该堆栈上;然后查看堆栈以设置所有者。我习惯于在其他 GUI 框架中为整个应用程序提供模态窗口,但 WPF 似乎没有它 - 你知道是否有一种简单的方法可以做到这一点吗?
      • @NeilBenn 你能在我的代码的第二行使用 message.Topmost = true 吗?我的意思是,OptionalMessageBox 是一个窗口吗?
      猜你喜欢
      • 2014-10-12
      • 1970-01-01
      • 2021-08-25
      • 2011-02-05
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      相关资源
      最近更新 更多