如何设置对话框的所有者窗口

时间:2015-04-20 14:55:36

标签: c# wpf

我有一个带有这两个分开的东西的WPF应用程序:

  • 主窗口
  • 对话框(单击主窗口上的关闭按钮时提示输出,如果单击[是],则整个应用程序将关闭,如果单击[否],则返回主窗口)

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

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

当点击对话框中的[是]和[否]按钮时,这是代码:

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

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

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

3 个答案:

答案 0 :(得分:2)

不确定所有者问题或调用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

下的“设置模态对话框结果”下的更多信息

答案 1 :(得分:0)

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

在这种情况下,SPMessageBox返回一个确定用户选择关闭Application的值非常重要。可以使用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的分配不应该有问题。

答案 2 :(得分:0)

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