C# Form.ShowDialog()或Form.ShowDialog(这个)?

C# Form.ShowDialog()或Form.ShowDialog(这个)?,c#,.net,winforms,C#,.net,Winforms,我听说如果我调用form.ShowDialog()而不指定所有者,那么可能会出现这样的情况:我在屏幕上看不到对话框表单(它将被其他窗口隐藏)。这是真的吗?我使用ShowDialog()数百次都没有指定所有者,我从来没有遇到过任何问题 你能解释一下在什么情况下我可以得到所描述的问题吗 更新: 嗯,我做了很多实验,在使用ShowDialog()时(没有指定所有者),我不会遇到任何真正意想不到的问题 所以我认为这只是关于ShowDialog()可能导致问题的谣言。 如果您不同意,请给我一个导致问题的代

我听说如果我调用form.ShowDialog()而不指定所有者,那么可能会出现这样的情况:我在屏幕上看不到对话框表单(它将被其他窗口隐藏)。这是真的吗?我使用ShowDialog()数百次都没有指定所有者,我从来没有遇到过任何问题

你能解释一下在什么情况下我可以得到所描述的问题吗

更新:

嗯,我做了很多实验,在使用ShowDialog()时(没有指定所有者),我不会遇到任何真正意想不到的问题

所以我认为这只是关于ShowDialog()可能导致问题的谣言。
如果您不同意,请给我一个导致问题的代码示例。

无参数ShowDialog()只使用“默认”父级。 不管“当前活动窗口”是什么,默认的父窗口都是什么。当您关心父线程是什么时,您需要显式地设置它。

当前活动窗口”通常指的是前台窗口,但仅当它属于当前线程时-请参见MSDN中的

(实际信息在社区内容中,但评论者说没有“每线程活动窗口”AFAIK是正确的)

因此,当用户切换到另一个应用程序(或线程)窗口时,您将得到一些“默认窗口”。即使.NET在这里发挥了一些神奇的作用,模式也会被破坏:预期的父窗口不会被禁用(例如,您可以切换到主窗口,关闭它,或者修改某些内容,这些内容通常会由于重入而中断您的应用程序)

另外,如果另一个应用程序当前处于活动状态,您的对话框将不会显示在顶部,但会隐藏在其他窗口后面

作为一个小麻烦,初始位置通常是不正确的或误导性的

实际上,这种情况很少发生:如果您打开对话框以响应主窗口上的菜单或按钮单击,用户实际上不会切换到另一个窗口


但是,从技术上讲,这是可能的,如果您打开对话框以响应某些自动化、外部消息等,则很可能发生这种情况。

我发现
ShowDialog()
vs
ShowDialog(this)

运行TestApp,显示
newform.ShowDialog()
,单击任务栏上的“显示桌面”或快速启动工具栏,单击任务栏上的TestApp。它显示了主窗体。你必须做一个Alt标签才能进入你的新表单

VS


运行TestApp,显示
newform.ShowDialog(此)
,单击任务栏或快速启动工具栏上的“显示桌面”,单击任务栏上的TestApp。它在顶部显示新表单。

是的,在某些情况下确实会有所不同。到目前为止,我对无参数方法没有任何问题,我有点惊讶于父窗体不是默认窗体。因此,为了避免意外行为,请始终将真实的父窗体传递给ShowDialog方法。

以下面的示例为例:

在主窗体中,您有一个启用了标签编辑的ListView。编辑特定标签后,将启动第二个窗口(使用
AfterLabelEdit
中的
ShowDialog()
)。新表单不会显示在任务栏中

如果用户开始编辑标签,然后单击另一个应用程序,则会显示第二个表单,但当返回到应用程序时,用户只会看到主表单,因为会显示模式对话框而禁用。然而,通常的闪烁机制(如果您单击调用者,它会将模式对话框变成字体)将不起作用(肯定是因为AfterEdit调用尚未返回),并且您的用户将无法访问第二个表单,除非使用Ctrl+Tab在打开的窗口中循环


调用ShowDialog(this)修复了此问题。

我遇到了此问题,要解决此问题,请将windows state属性更改为normal,因为它可能已最小化。

只是为了更好地理解所有者拥有的关系:

.NET允许窗体“拥有”其他窗体。拥有的表单对于 浮动工具箱和命令窗口。自有表单的一个示例是 Microsoft Word中的“查找和替换”窗口。当打开所有者窗口时 最小化,拥有的表单也会自动最小化。当 拥有的表单与其所有者重叠,它始终显示在顶部

(c) Matthew MacDonald的“Pro.NET 2.0 Windows窗体和自定义控件”


ShowDialog显示新表单时,将显示隐式关系 在当前活动表单(称为所有者)之间建立 表单,以及新表单,称为自有表单。这种关系 确保拥有的表单是活动表单,并且始终显示在屏幕上 所有者表单的顶部

这种关系的一个特点是,拥有的表单会影响 其所有者窗体的行为(使用ShowDialog时):

  • 所有者表单不能最小化、最大化甚至移动
  • 拥有的表单阻止鼠标和键盘输入到所有者表单
  • 当所拥有的表单为空时,所有者表单最小化
  • 只有拥有的表单才能关闭
  • 如果所有者和所有者表单都最小化,并且如果用户按Alt+Tab切换到所有者表单,则所有者表单被激活
但是,与ShowDialog方法不同,调用Show方法会 未建立隐含的所有者所有关系。这意味着 任一表单都可以是当前活动的表单

如果没有隐含的所有者拥有关系,则所有者和所有者拥有表单 相似项可以最小化、最大化或移动。如果用户关闭任何 除主窗体外,最近激活的窗体为 重新激活

尽管ShowDialog建立了一种隐含的所有者所有关系
, 没有