【问题标题】:DialogResult can be set only after Window is created and shown as dialogDialogResult 只能在创建 Window 并显示为对话框后设置
【发布时间】:2011-08-18 20:25:34
【问题描述】:

我有一个 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 抛出异常。所以我添加了一个使用 IsThreadModal 的 if 检查。它已经工作了一段时间,但现在 m_OwningWindow 没有关闭,因为 IsThreadModal 为假。

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

【问题讨论】:

    标签: c# wpf window dialogresult


    【解决方案1】:

    我在分配DialogResult 之前隐藏了我的窗口。交换订单,因此在隐藏窗口之前分配了DialogResult,解决了我的问题。即使窗口是ShowDialog'd,也必须将其视为“打开”才能设置DialogResult

    编辑:窗口应该关闭,而不是隐藏。我发帖后就被我咬了。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我主要关心的是在 window.close() 之后引用窗口的属性是否安全? System.Windows.Window 上没有 Disposed 属性
      【解决方案3】:

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

      无论它是否是对话框,您都应该能够在希望关闭表单时使用 Close()。 (在某些情况下您可能还需要在关闭后进行 Dispose)

      此外,DialogResult 是一个枚举类型 - true 不是我希望看到的分配给它的值。通常会使用DialogResult.OKDialogResult.Yes

      【讨论】:

      • 谢谢。它不是形式。它是 WPF 窗口,没有 Modal 属性,我可以使用 window.Close 来关闭它,但我想根据用户单击“确定”按钮或“取消”退出窗口来做不同的事情。 WPF窗口上的DialogResult是bool?不枚举
      猜你喜欢
      • 1970-01-01
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-05
      相关资源
      最近更新 更多