【问题标题】:When passing a valid owner into Form.ShowDialog(), the new form is modal over all current open forms将有效所有者传递给 Form.ShowDialog() 时,新表单在所有当前打开的表单上都是模态的
【发布时间】:2017-06-20 14:55:15
【问题描述】:

正如标题所说,我运行 form.ShowDialog(parentForm),其中 parentForm 是有效的 IWin32Window 继承表单,打开的窗口阻止访问父表单(如预期的那样),但 也是 阻止访问我的主窗体。

我能看到的唯一原因是主窗体和父窗体与显示的对话框位于同一线程上。有没有可能发生这种情况的原因?而且,如果问题是由共享线程引起的,有没有办法在不打开单独线程的对话框的情况下解决它?

【问题讨论】:

  • 主窗体和父窗体有什么关系?他们之间是否存在现有的所有者/拥有或父/子关系?如果有,是什么?
  • 这就是模式对话框在 Windows 中的工作方式(所有者与被阻止的内容无关)。在同一线程上显示为非模式或在单独的线程上显示为模式(只是不确定在后一种情况下是否可以使用来自另一个线程的所有者)。
  • 你很容易让自己陷入很多的麻烦。如果你不喜欢 ShowDialog() 的作用,那么就不要使用它,而是使用 Show() 并使用 FormClosing 事件来知道窗口即将消失。但请务必了解 为什么 ShowDialog 存在以及它避免了哪些可能的错误。重入错误与线程错误一样令人讨厌。 Read this.
  • @Ivan 谢谢,我认为你是对的。我的方法可能是在当前线程上显示一个非模态表单。

标签: c# winforms


【解决方案1】:

如果我对您的理解正确,您希望同时访问父表单和子表单,

如果您使用ShowDialog(),机器人将可以访问父表单

使用form.Show(parentForm) 而不是form.ShowDialog(parentForm)

【讨论】:

    猜你喜欢
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    相关资源
    最近更新 更多