设置DialogResult而不关闭对话框

时间:2016-05-24 12:53:32

标签: c# wpf mvvm dialog

正如标题所说,无论如何设置DialogResult而不关闭Dialog?

可能简单的答案是否定的,但即便如此,为什么呢? DialogResult=背后的行为是什么?有没有办法覆盖它。

对于任何询问的人,为什么我甚至需要这样的东西,简单的答案就是好奇心。这个好奇心背后的“历史”是我试图从我的ViewModel调用对话框窗口。我的方法是以下的混合

如果对话框有返回值(True(Ok)/ False(Cancel)),我需要传递(从对话框viewModel)值,处理Dialogs的类,然后将其设置为{{1为了让父窗口/控件在对话框返回/关闭时获取它。

用于测试它的最小代码片段类似于

DialogResult

虽然这不会失败,但在调用dialog.DialogResult = TheResult; Debug.WriteLine("Dialog Closed"); dialog.Close(); 之前,当“对话框关闭”打印到输出时,对话框会关闭。如果我覆盖dialog.Close();事件,我可以在调用Window.Closing时看到它触发,但之后调用dialog.DialogResult时却看不到。

注意:正如我所说,整个问题是“出于好奇”,因为上面的代码有效并且不会损害所需的功能。

2 个答案:

答案 0 :(得分:4)

这是设计,设置DialogResult将关闭Dialog。查看Source Code for Window.DialogResult

    public Nullable<bool> DialogResult
    {
        get
        {
           ....
        }
        set
        {
             ....
                if (_dialogResult != value)
                {
                    _dialogResult = value;                       
                    if(_isClosing == false)
                    {
                        Close();
                    }
                }
             ...
            }                
        }
    }

答案 1 :(得分:1)

这是预期的行为。看看下面的

https://marlongrech.wordpress.com/2008/05/28/wpf-dialogs-and-dialogresult/

具体......

&#34;在Window上设置此属性后,窗口将自动关闭,ShowDialog方法将返回您在DialogResult属性中设置的结果。

因为DialogResult返回对话框的结果,所以设置DialogResult的值会发出对话框结束的信号是有道理的。

设置DialogResult会触发关闭。当前方法完成后,对话框将关闭。这意味着执行Debug.WriteLine以及dialog.Close()。

如果您在按钮单击

中运行以下内容,则会看到相同的内容
this.Close();
MessageBox.Show("TEST");
this.Close();

第一次调用Close将触发关闭并触发Closing和Closed事件,代码继续执行,因此显示消息框,第二次调用Close被调用,但它被忽略,因为已经调用了close。它不会再发生任何事件。

这是我测试过的代码,我在App.xaml.cs的OnStartup事件中使用ShowDialog打开了MainWindow

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        this.DialogResult = true;
        //Or call Close
        //this.Close();

        MessageBox.Show("TEST");

        this.Close();
    }

    private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        MessageBox.Show("Window_Closing");
    }

    private void Window_Closed(object sender, EventArgs e)
    {
        MessageBox.Show("Window_Closed");
    }
}