【问题标题】:Force MessageBox to be on top of application window in .net/WPF强制 MessageBox 位于 .net/WPF 中的应用程序窗口顶部
【发布时间】:2012-04-10 16:21:49
【问题描述】:

在我的 WPF 应用程序中,我有时会出现 System.Windows.MessageBox。当它最初显示时,它会显示在我的主应用程序窗口的顶部,就像我想要的那样。有没有办法可以强制它始终保持在主窗口的顶部?我遇到的问题是,当显示MessageBox 时,用户可以单击主应用程序窗口并将其带到前面,这意味着MessageBox 将隐藏在视图之外。在这种情况下,用户可能没有意识到它的存在,或者忘记了它,对他们来说,主应用程序似乎已经冻结了。

我已经阅读了很多关于此的主题,但没有一个为我解决问题。

我应该补充一点,提出MessageBox 的线程可能不是 UI 线程。 谢谢 汤姆

【问题讨论】:

    标签: wpf .net-4.0 modal-dialog messagebox


    【解决方案1】:

    使用MessageBox.Show 的版本,它需要一个窗口“所有者”并传递您的窗口。

    MessageBox.Show(Application.Current.MainWindow, "Im always on top - of the main window");
    

    如果您可能不在 UI 线程上,请尝试:

    string msg="Hello!";
    if (Application.Current.Dispatcher.CheckAccess()) {
        MessageBox.Show(Application.Current.MainWindow, msg);
    }
    else {
        Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(()=>{
            MessageBox.Show(Application.Current.MainWindow, msg);
        }));
    }
    

    您可以:
    1. Invoke 阻止您的线程,直到 MessageBox 被解除或
    2. BeginInvoke 在这种情况下,您的线程代码将继续执行,但 UI 线程将在 MessageBox 上阻塞,直到其被解除)。

    【讨论】:

    • 如果放置 MessageBox 的线程不是 UI 线程(即不是拥有 MainWindow 的线程),还有其他方法吗?
    • 啊,现在应该在初始问题中添加信息 - 我建议现在添加!
    • @Ricibob:我曾经使用过这种方法将消息发送到状态栏而不是弹出消息框。
    • @TomDavies 我已经用 Invoke 和 BeginInvoke 对此进行了测试,在这两种情况下都可以正常工作(具有不同的阻塞行为)。
    • @TomDavies 如果您在 WPF 中运行的不仅仅是 UI 线程,那将是一个好主意;-) 这里有一些调度程序背景:stackoverflow.com/questions/7839296/…
    【解决方案2】:

    这是将消息框放在应用程序窗口顶部的快速方法。

    MessageBox.Show(this ,"Output text"));

    【讨论】:

      【解决方案3】:

      在您的“public partial class MainWindow : Window”内放置以下代码。因此 Invoke 将在 UI 线程中运行您的代码。

      void ShowErrorMessage(ERROR err)
      {
          this.Dispatcher.Invoke((Action)(() =>
          {
              MessageBox.Show(err.description, err.code.ToString(), MessageBoxButton.OK, MessageBoxImage.Error);
          }));
      }
      

      【讨论】:

        猜你喜欢
        • 2010-12-24
        • 1970-01-01
        • 2013-11-26
        • 1970-01-01
        • 1970-01-01
        • 2010-12-10
        • 1970-01-01
        • 2013-11-03
        • 1970-01-01
        相关资源
        最近更新 更多