WPF消息框不等待结果 [WPF NotifyIcon]

10
我正在使用 WPF NotifyIcon 创建一个系统托盘服务。当我显示一个消息框时,它会出现半秒钟,然后立即消失而不等待输入。
这种情况以前曾经发生过,通常的建议是使用一个接受Window参数的重载。然而,作为系统托盘服务,没有窗口可用作父窗口,而null不能代替它。
除了创建自定义MessageBox窗口之外,是否有任何方法可以使MessageBox等待用户输入?

我建议尝试这个:http://msdn.microsoft.com/ru-ru/library/system.windows.controls.primitives.popup(v=vs.110).aspx - nuclear sweet
我也遇到了同样的问题,即使使用WPF NotifyIcon,尽管它似乎是一个更普遍的问题。我还注意到,如果连续触发两个消息框,第一个只会短暂显示,但第二个会一直停留。 - Steven Jeuris
WPF NotifyIcon codeproject页面上的相关评论。 - Steven Jeuris
2个回答

28
您无需创建代理窗口就能实现此操作。只需在您的消息框中添加MessageBoxOptions.DefaultDesktopOnly,即可在您的桌面上启动消息框,而不会消失。
示例:
MessageBox.Show("My Message", "Title", MessageBoxButton.OK, 
    MessageBoxImage.Information, MessageBoxResult.OK, 
    MessageBoxOptions.DefaultDesktopOnly);

1
ServiceNotification 有相同的效果,只是消息框显示在活动桌面而不是默认桌面上。我认为这对于多个监视器更友好。 - Grault

0
根据这里的回答,一种解决方法是实际上打开一个不可见的窗口,并将其作为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)。只做一次不够。你有同样的经历吗? - Steven Jeuris
你能不能不要简单地关闭它,然后只在应用程序关闭时关闭它? - Gigi
抱歉造成困惑。我所指的是实际上您不需要传递第一个窗口参数。另一种方法是在调用MessageBox.Show之前仅打开至少一个其他WPF窗口。奇怪的是,这也可以是一个自动关闭的早期MessageBox.Show!因此,调用两次Show()“有效”,尽管显然非常不可取。知道了这一点,我正在寻找一种解决方案,以便无需不断传递window参数。 - Steven Jeuris
然而,我找不到任何解决方案,最终也使用了这个方法,使用一个包装类来实例化窗口。与其调整窗口大小/位置,设置 Visibility = Visibility.Hidden 可能更可取。如果您有不同意见,请随意回滚。 - Steven Jeuris
不要,不要,不要这样做。MessageBox有一个带有MessageBoxOptions的重载,使用它是有原因的。 - Wobbles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接