【问题标题】:How to set the owner window of a dialog如何设置对话框的所有者窗口
【发布时间】:2015-04-20 23:29:22
【问题描述】:

我有一个 WPF 应用程序,其中包含这两个分开的东西:

  • 主窗口
  • 对话框(点击主窗口关闭按钮时弹出,点击[yes]关闭整个应用程序,点击[no]返回主窗口)

这是我点击主窗口关闭按钮时的代码:

private void CloseBtn_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
                SPMessageBox msgBox = new SPMessageBox();
                msgBox.Owner = this;
                msgBox.ShowDialog();          
        }

下面是点击对话框上的[yes]和[no]按钮时的代码:

public void Yes_Click(object sender, RoutedEventArgs e)
        {
            Application.Current.Shutdown();
        }

private void No_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

当点击 [no] 按钮时,整个应用程序停止工作。是不是因为所有者已更改,因此无法返回主窗口?如何处理这个问题,以便在单击[no]按钮后可以返回主窗口?

【问题讨论】:

  • CloseBtn 是关闭应用程序的按钮吗?为什么不使用窗口的Closing 事件呢?
  • 你在使用父窗口的Closing事件吗?

标签: c# wpf


【解决方案1】:

不确定所有者问题或调用 this.Close() 时会发生什么,但这是我学会处理对话框点击的方式:

private void Yes_Click(object sender, RoutedEventArgs e)
{
    this.DialogResult = true;
}
private void No_Click(object sender, RoutedEventArgs e)
{
    this.DialogResult = false;
}

假设 SPMessageBox 从 Window 继承,这应该关闭对话框并让您在 CloseBtn_MouseLeftButtonDown 中处理结果,如下所示:

if (msgBox.ShowDialog() == true)
   Application.Current.Shutdown();

“== true”是必需的,因为返回类型是 bool? (可为空的布尔值)。

“设置模态对话框结果”下的更多信息在 this MSDN page 上稍稍降低

【讨论】:

  • 嗨@Hogler,感谢您的解决方案,它对我很有效。实际上主要原因是我的窗口的 DragMove(),因为我的窗口是无边界的,所以我将 DragMove() 应用于我的窗口,并导致了这样的问题。现在我应用您的解决方案并将 DragMove() 放到我的窗口“标题栏”上,一切正常。
【解决方案2】:

正如我在评论中所说,我更喜欢窗口的Closing 事件在必要时取消它。

在这种情况下,SPMessageBox 返回一个决定用户选择关闭应用程序的值很重要。可以使用DialogResult 属性来完成:

public void Yes_Click(object sender, RoutedEventArgs e)
{
    this.DialogResult = true;//close application
    this.Close();
}

private void No_Click(object sender, RoutedEventArgs e)
{
    this.DialogResult = false;//keep application open
    this.Close();
}

这里是对话框的调用:

private void Window_Closing(object sender, CancelEventArgs e)
{
    SPMessageBox msgBox = new SPMessageBox();
    msgBox.Owner = this;
    if (msgBox.ShowDialog() == false)
    {
        e.Cancel = true;//cancel closing the window
    }
}

但我不确定这是否能解决真正的问题。我还在一个新的 WPF 应用程序中测试了您的代码,并且没有遇到任何问题。我认为您的代码中必须有另一部分,这会产生问题。 Owner 的赋值应该没有问题。

【讨论】:

    【解决方案3】:

    您应该设置.DialogResult 属性以正确关闭对话框。打开对话框的代码应该检查结果并实际执行操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 2021-03-25
      • 2021-08-25
      • 1970-01-01
      • 2011-02-05
      • 1970-01-01
      • 2016-04-02
      相关资源
      最近更新 更多