正如标题所说,无论如何设置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
时却看不到。
注意:正如我所说,整个问题是“出于好奇”,因为上面的代码有效并且不会损害所需的功能。
答案 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");
}
}