只有在创建Window并显示为对话框后才能设置DialogResult

我有一个主WPF窗口,mywindow.showDialog,当在窗口上单击一个按钮时,执行一个命令让我们说命令是SendToTableCommand

protected virtual void SendToTableExecute(object o) { UIThread.BeginInvoke(new Action(SendToTableExecuteUI),o); } private void SendToTableExecuteUI(object o) { if (o is Control) { m_OwningWindow = UIHelper.FindVisualParent((Control)o); } do sth... if (m_OwningWindow != null) { //only set DialogResult when window is ShowDialog before if(System.Windows.Interop.ComponentDispatcher.IsThreadModal) m_OwningWindow.DialogResult = true; } } 

前一段时间, m_OwningWindow.DialogResult = true抛出exception。 所以我添加了一个使用IsThreadModal的if检查。 它已经工作了一段时间,但现在m_OwningWindow不会因为IsThreadModal是假的而关闭。

我不知道解决问题的正确方法是什么,并认为我没有正确处理它。 请帮忙。 提前致谢

杰森的回复让我想起了一个解决方法。 即使用Window.Close(),然后在窗口上添加一个bool类型属性,比如OKClicked,替换任何设置DialogResult与window.Close(); window.OKClicked = true或false。 用window.OKClicked替换对window.DialogResult的引用。 解决方法有什么问题吗? 谢谢

在分配DialogResult之前我隐藏了我的窗口。 交换顺序,所以在隐藏窗口之前分配DialogResult ,修复了我的问题。 即使窗口是ShowDialog ,它也必须被认为是“打开”才能设置DialogResult

编辑 :窗口应该关闭,而不是隐藏。 我发布后,那点点滴滴。

使用Form.Modal确定您的表单是作为窗口还是模式对话框打开。

无论是否是对话框,您都应该能够关闭()表格。 (在某些情况下,您可能还需要在关闭后处理它)

另外,DialogResult是一个枚举类型 – true不是我期望看到的值。 通常, DialogResult.OKDialogResult.Yes将用于此目的。