【问题标题】:Set DialogResult without closing the Dialog在不关闭对话框的情况下设置 DialogResult
【发布时间】:2016-05-24 12:53:31
【问题描述】:

正如标题所说,有没有在不关闭对话框的情况下设置DialogResult?

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

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

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

用于测试它的最小代码 sn-p,类似于

dialog.DialogResult = TheResult;
Debug.WriteLine("Dialog Closed");
dialog.Close();

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

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

【问题讨论】:

  • 您确定它在实际调用Close() 之前关闭吗?有什么例外吗?你能显示更多代码吗?
  • @PatrickHofman 我添加了更多信息。我认为我的其余代码无关紧要。我也没有任何例外。
  • @PatrickHofman 是的!通过设置DialogResult,它会自动关闭窗口!这对我来说是全新的。我已经设置DialogResult 并使用Close() 6 年了!来源:docs.microsoft.com/en-us/dotnet/api/…,引用:“对话框上的确定和取消按钮也是开发人员提供的,尽管可能会设置 DialogResult,它会自动关闭通过调用 ShowDialog 打开的窗口。”

标签: c# wpf mvvm dialog


【解决方案1】:

这是设计使然,设置DialogResult会关闭Dialog。检查Source Code for Window.DialogResult

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

【讨论】:

    【解决方案2】:

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

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

    具体...

    “一旦您在 Window 上设置了此属性,该窗口将自动关闭,并且 ShowDialog 方法返回您在 DialogResult 属性中设置的结果。

    因为 DialogResult 正在返回对话框的结果,所以设置 DialogResult 的值将标志着对话框的使用结束。

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

    如果您在按钮单击中运行以下命令,您会看到相同的结果

    this.Close();
    MessageBox.Show("TEST");
    this.Close();
    

    第一次调用 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");
        }
    }
    

    【讨论】:

    • 在我的例子中,Closing 和 Closed 事件被触发,代码继续执行但消息框不再显示。
    • 很奇怪 MessageBox 没有显示在您的案例中。我用我测试过的简单代码更新了我的答案。当我单击按钮时,我看到“Window_Closing”,对话框消失,然后我看到“Window_Closed”,然后是“TEST”,然后应用程序关闭。
    • 这也是我的测试用例,我们得到了相同的结果,对话框在 DialogResult = 上消失了。
    猜你喜欢
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 2016-12-17
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多