Form.ShowDialog()或Form.ShowDialog(this)?

nig*_*der 35 .net c# winforms

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

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

更新:

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

所以我认为只是传言ShowDialog()会导致问题.如果您不同意 - 请给我一个代码示例,请导致问题.

小智 21

我发现ShowDialog()vs的一个烦恼ShowDialog(this).

运行TestApp,显示newform.ShowDialog(),单击任务栏上的"show Desktop"或快速启动工具栏,单击任务栏上的TestApp.它显示了Mainform.您必须执行Alt-Tab才能访问新表单.

VS

运行TestApp,显示newform.ShowDialog(this),单击任务栏上的"show Desktop"或快速启动工具栏,单击任务栏上的TestApp.它显示了顶部的新形式.


pet*_*hen 8

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

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

因此,当用户切换到另一个应用程序(或线程)窗口时,最终会出现一些"默认窗口".即使.NET在这里做了一些魔术,模式也会被破坏:预期的父窗口不会被禁用(例如,您可以切换到主窗口,关闭它,或修改某些东西,这会因为重入而经常破坏您的应用程序) .

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

作为一个轻微的烦恼,初始位置通常是不正确或误导.

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

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

  • 作为一般规则,如果可以指定父级,则应指定父级.它永远不会伤害,它经常有帮助. (5认同)

nig*_*der 7

只是为了更好地了解业主拥有的关系:

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

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


ShowDialog显示新表单时,在当前活动表单(称为所有者表单)和新表单(称为拥有表单)之间建立隐式关系.此关系可确保拥有的表单是活动表单,并始终显示在所有者表单的顶部.

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

  • 所有者表单无法最小化,最大化甚至移动.
  • 拥有的表单阻止鼠标和键盘输入到所有者表单.
  • 拥有的表单最小化所有者表单.
  • 只能关闭所拥有的表格.
  • 如果所有者和拥有的表单都被最小化,并且如果用户按Alt + Tab切换到拥有的表单,则激活拥有的表单.

但是,与ShowDialog方法不同,对Show方法的调用不会建立隐式所有者拥有的关系.这意味着任何一种形式都可以是当前活动的形式.

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

尽管ShowDialog建立了一个隐式的所有者拥有的关系,但是拥有的表单没有内置的方式来回调或查询打开它的表单.在无模式的情况下,您可以设置新表单的所有者属性以建立所有者拥有的关系.作为一种快捷方式,您可以将所有者表单作为参数传递给Show方法的重载,该方法也采用IWin32Window参数(IWin32Window由通过IWin32Window.Handle属性公开Win32 HWND属性的Windows窗体UI对象实现).

显式模态所有者拥有的表单关系中的表单行为与其隐式模式对应关系相同,但无模式所有者拥有的关系在非所有者拥有的无模式情况下提供了额外的行为.首先,无模式拥有的表单始终显示在所有者表单的顶部,即使其中任何一个都可以处于活动状态.当您需要在应用程序中的其他表单之上保留表单(例如浮动工具窗口)时,这非常有用.其次,如果用户按Alt + Tab从所有者切换,则拥有的表单也会跟随.为了确保用户知道哪个表单是主表单,最小化所有者会隐藏所有自有表单的任务栏按钮,只显示所有者的任务栏按钮.

(c)Chris Sells的"Windows Forms 2.0 Programming",Michael Weinhardt.


Ira*_*tro 5

无参数的ShowDialog()只使用"默认"父级.对于它的价值,默认父级是"当前活动窗口".当您关心父级是什么时,您需要明确地设置它.