来自非模态 WPF 窗口的应用程序模态 MessageBox

Posted

技术标签:

【中文标题】来自非模态 WPF 窗口的应用程序模态 MessageBox【英文标题】:Application-modal MessageBox from non-modal WPF window 【发布时间】:2013-05-22 21:15:55 【问题描述】:

我正在开发一个包含 Winforms 和 WPF 混合的应用程序。该应用程序的旧部分是 Winforms(包括“主”应用程序窗口),其中一些较新的屏幕是 WPF。这些 WPF 窗口通常不会以模态方式启动,因为用户通常会同时在不同的屏幕上工作。

如果用户因在任何 WPF 屏幕上的特定操作而遇到警告/错误,通常会通过 WPF 消息框 (System.Windows.MessageBox) 通知他们。有没有办法让这些消息框在应用程序级别而不是在启动它的特定屏幕级别成为模式?我想强制用户在与其他屏幕交互之前确认警告。

使用 System.Windows.Forms.MessageBox 似乎可行,但我想坚持使用 System.Windows.MessageBox。谢谢。

【问题讨论】:

【参考方案1】:

在 WPF 中这没有问题。您只需为 MessageBox.Show 调用指定 Window owner 参数。拥有的消息框本质上是模态的。例如,使用 Show 的这个重载版本来自定义消息框:

public static MessageBoxResult Show(Window owner, string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon);

这是非常简单的(虽然肯定可以工作:))示例:

MainWindow.xaml:

<Window x:Class="WpfApplication2_ModalMessageBox.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button VerticalAlignment="Center" HorizontalAlignment="Center"
            Click="Button_Click">Modal</Button>
    </Grid>
</Window>

MainWindow.xaml.cs:

public partial class MainWindow : Window

    public MainWindow()
    
        InitializeComponent();
    

    private void Button_Click(object sender, RoutedEventArgs e)
    
        MessageBox.Show(this, "Text", "Caption", MessageBoxButton.OK, MessageBoxImage.Information);
    

【讨论】:

为此,主窗口“所有者”必须是 WPF。这里的问题是我有一个 Winform 主窗口,一个辅助 WPF 屏幕(不是以模态方式启动的),当从 WPF 屏幕显示 WPF 消息框时,它只是 WPF 窗口的模态,而不是整个应用程序。

以上是关于来自非模态 WPF 窗口的应用程序模态 MessageBox的主要内容,如果未能解决你的问题,请参考以下文章

“模态”与“非模态”

WPF 解决弹出模态窗口关闭后,主窗口不在最前

Qt 之 模态非模态半模态窗口的介绍及 实现QDialog的exec()方法

关于创建模态窗口和非模态窗口的研究

模态对话框与非模态窗口

如何在 WPF 中制作模态对话框?