如果从隐藏 windows 调用 ShowDialog() 会提前结束

ShowDialog() ends prematurely if called from hidden windows

考虑这段代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Title = DateTime.Now.ToString();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Hide();
        new MainWindow().ShowDialog();
        Show();
        Debug.WriteLine(Title);
    }
}

XAML 是微不足道的:

<Window x:Class="ShowHide.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <Button
            Content="Test"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            Click="Button_Click"/>
    </Grid>
</Window>

如果我去 "up",它会按预期工作 - this window 被隐藏,新的被创建并显示为模态 window。但是当我关闭当前可见的 window 时,所有隐藏的 windows "underneath" 都会立即显示出来并且它们不再是模态的。输出中出现多行 window.

但是,如果我注释掉 Hide() 调用,问题似乎不会出现,即我可以反向关闭模态 windows。

重现:

  1. 运行代码。
  2. 按 "Test" 按钮。当前的window会隐藏,新的会出现
  3. 在新的 window 中按 "Test" 按钮。将再次创建另一个 window。您可以根据需要多次重复此步骤。
  4. 关闭window。较旧的 windows 将立即重新出现,并且都不是模态的。

这是设计使然吗?您的解决方法是什么?

这是设计使然,因为您隐藏模态框 window 并使用 Show() 而不是 ShowDialog() 再次显示它,因此您可以按如下方式修改代码:

bool isChild;

private void Button_Click(object sender, RoutedEventArgs e)
{
    Hide();
    new MainWindow() { isChild = true }.ShowDialog();

    if (isChild)
    {
        ShowDialog();
    }
    else
    {
        Show();
    }
}

代码就像你写的一样工作。您调用方法 Show(),但您应该编写 ShowDialog()。只需更改此代码:

 Hide();
 new MainWindow().ShowDialog();
 Show();

收件人:

  Hide();
 new MainWindow().ShowDialog();
 ShowDialog();