我有一个主WPF窗口mywindow.showDialog当单击窗口上的按钮时,将执行命令比如命令是sendtotableccommand
protected virtual void SendToTableExecute(object o)
{
UIThread.BeginInvoke(new Action<object>(SendToTableExecuteUI),o);
}
private void SendToTableExecuteUI(object o)
{
if (o is Control)
{
m_OwningWindow = UIHelper.FindVisualParent<Window>((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
抛出异常。所以我添加了一个if检查使用IsThreadModal。它已经工作了一段时间,但现在m_owningwindow不关闭,因为IsThreadModal是假的。
我不知道解决这个问题的正确方法是什么,我认为我没有处理好。请帮助。提前感谢
Jason的回复让我想起了一个变通方法。即使用window. close(),然后在窗口上添加bool类型属性,例如OKClicked,替换任何设置dialog . close()的地方;窗口。OKClicked =真或假。替换对窗口的引用。对话结果与窗口。ok点击。解决方案有问题吗?由于
我在分配DialogResult
之前隐藏了我的窗口。交换顺序,因此DialogResult
在窗口隐藏之前被分配,解决了我的问题。即使窗口是ShowDialog
'd,为了设置DialogResult
,它也必须被认为是"打开的"。
Edit:窗口应该关闭,而不是隐藏。
使用Form.Modal
来确定窗体是作为窗口还是模态对话框打开的
你应该能够关闭()表单当你想要它关闭,不管它是否是一个对话框。(在某些情况下,您也可能需要在关闭后处理它)
另外,dialgresult是一个枚举类型- true
不是一个值,我希望看到被分配给它。通常使用DialogResult.OK
或DialogResult.Yes
。