对话框结果只能在窗口创建并显示为对话框后设置。

4

我有一个主WPF窗口,mywindow.showDialog 当窗口上的按钮被点击时,会执行一个命令 假设该命令是SendToTableCommand

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 为 false。

我不知道解决这个问题的正确方法,认为我没有处理好。请帮忙解决。谢谢!

3个回答

1
Jason 的回复让我想到了一个解决方法。即使用 Window.Close(),然后在窗口上添加一个布尔类型属性,比如说 OKClicked,将任何设置 DialogResult 的地方替换为 window.Close(); window.OKClicked = true 或 false。将对窗口.DialogResult 的引用替换为 window.OKClicked。这种解决方法有什么问题吗?谢谢。

1
我的主要关注点是在 window.close() 之后引用窗口的属性是否安全?System.Windows.Window 上没有 Disposed 属性。 - susu

0
在分配DialogResult之前,我正在隐藏我的窗口。改变顺序,所以在隐藏窗口之前分配DialogResult可以解决我的问题。即使窗口被ShowDialog,它也必须被视为“打开”,才能设置DialogResult编辑:窗口应该被关闭,而不是隐藏。在我发布后,这个问题困扰了我。

-1
使用 Form.Modal 来确定你的窗体是以窗口还是模态对话框的形式打开。
无论是对话框还是其他形式,你都应该能够在需要关闭时使用 Close() 方法来关闭它。(在某些情况下,你可能还需要在关闭后将其 Dispose)
此外,DialogResult 是一个枚举类型 - 我不希望看到被赋值为 true 的情况。通常会使用 DialogResult.OKDialogResult.Yes

5
谢谢。这不是表单,它是WPF窗口,并且没有模态属性。我可以使用window.Close来关闭它,但我想根据用户点击“确定”按钮或“取消”按钮来执行不同的操作来退出窗口。在WPF窗口上,DialogResult的类型是bool?而不是枚举类型。 - susu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接