【问题标题】:WPF MessageBox not waiting for result [WPF NotifyIcon]WPF MessageBox 不等待结果 [WPF NotifyIcon]
【发布时间】:2014-03-14 10:57:20
【问题描述】:

我正在使用WPF NotifyIcon 创建系统托盘服务。当我显示一个消息框时,它会显示半秒钟,然后立即消失,无需等待输入。

这种情况有happened before,通常的建议是使用接受Window参数的重载。但是,作为系统托盘服务,没有可用作父窗口的窗口,并且不接受null。

除了自己创建自定义 MessageBox 窗口之外,还有什么方法可以让 MessageBox 等待用户输入?

【问题讨论】:

标签: c# .net wpf messagebox notifyicon


【解决方案1】:

您不需要为此创建代理窗口。只需将 MessageBoxOptions.DefaultDesktopOnly 添加到您的消息框,它就会在您的桌面上触发而不会消失。

例子

MessageBox.Show("My Message", "Title", MessageBoxButton.OK, 
    MessageBoxImage.Information, MessageBoxResult.OK, 
    MessageBoxOptions.DefaultDesktopOnly);

【讨论】:

  • ServiceNotification 具有相同的效果,只是消息框显示在活动桌面上,而不是默认的。我认为这在多台显示器上播放效果更好。
【解决方案2】:

根据here的回答,解决方法是实际打开一个不可见的窗口并将其用作MessageBox的父级:

        Window window = new Window()
        {
            Visibility = Visibility.Hidden,
            // Just hiding the window is not sufficient, as it still temporarily pops up the first time. Therefore, make it transparent.
            AllowsTransparency = true,
            Background = System.Windows.Media.Brushes.Transparent,
            WindowStyle = WindowStyle.None,
            ShowInTaskbar = false
        };

        window.Show();

...然后使用适当的参数打开 MessageBox:

        MessageBox.Show(window, "Titie", "Text");

...完成后不要忘记关闭窗口(可能在应用程序退出时):

        window.close();

我试过了,效果很好。必须打开一个额外的窗口是不可取的,但它比仅仅为了完成这项工作而制作自己的消息框窗口要好。

【讨论】:

  • 每次从上下文菜单触发命令时,我都需要打开这个窗口(我想显示一个MessageBox)。做一次是不够的。你有同样的经历吗?
  • 能不能干脆不关闭,等应用关闭后再关闭?
  • 很抱歉给您带来了困惑。我指的是实际上您不需要传递第一个窗口参数。 另一种方法是在调用 MessageBox.Show 之前至少打开一个其他 WPF 窗口。奇怪的是,这也可以是更早的MessageBox.Show,它会自动关闭!因此调用Show() 两次“有效”,尽管显然是非常不可取的。知道了这一点,我一直在寻找一种解决方案,以便不需要不断地传递 window 参数。
  • 但是,我找不到任何东西,最后也使用了这个解决方案,使用了一个实例化窗口的包装类。与其调整窗口大小/定位窗口,不如设置Visibility = Visibility.Hidden 可能更可取。如果您不同意,请随时回滚。
  • 不不不不不,请不要这样做。 MessageBox 中带有 MessageBoxOptions 的重载是有原因的,请使用它。
猜你喜欢
  • 1970-01-01
  • 2012-06-09
  • 2021-06-15
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
相关资源
最近更新 更多