首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Form.ShowDialog()还是Form.ShowDialog(这个)?

Form.ShowDialog()还是Form.ShowDialog(这个)?
EN

Stack Overflow用户
提问于 2009-05-03 12:03:13
回答 9查看 61.5K关注 0票数 44

我听说,如果我调用form.ShowDialog()而没有指定所有者,那么就有一种情况是,我不会在屏幕上看到对话框表单(它将与其他窗口一起隐藏)。是真的吗?我使用ShowDialog()时没有指定所有者数百次,而且我从来没有遇到过任何问题。

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

更新:

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

因此,我认为,ShowDialog()可能会导致问题,这只是谣言。如果你不同意-给我一个代码样本,请导致问题。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2013-06-30 17:19:48

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

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

(c) "Pro .NET 2.0 Windows窗体和自定义控件“,由MacDonald编写。

ShowDialog所示,在当前活动窗体(称为所有者窗体)和新窗体(称为自有窗体)之间建立了隐式关系。这种关系确保了拥有的表单是活动窗体,并且总是显示在所有者窗体的顶部。这种关系的一个特点是,拥有的表单会影响其所有者表单的行为(当使用ShowDialog时):

  • 所有者表单不能最小化、最大化,甚至不能移动。
  • 拥有的表单阻止鼠标和键盘输入到所有者窗体。
  • 当拥有的表单被最小化时,所有者表单将被最小化。
  • 只有拥有的表单才能关闭。
  • 如果所有者和拥有的表单都被最小化,并且如果用户按Alt+Tab以切换到拥有的表单,那么拥有的表单就会被激活。

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

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

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

显式模态所有者-形式关系中的形式行为与其隐式模式关系相同,但非模态所有者-所有者关系在非所有者无模式情况下提供了附加行为。首先,非模态拥有的表单总是出现在所有者表单的顶部,即使两者都可以是活动的。当您需要将窗体(如浮动工具窗口)保存在应用程序中的其他窗体之上时,这是非常有用的。第二,如果用户按Alt+Tab键从所有者切换,那么拥有的表单也会跟着做。为了确保用户知道哪个表单是主表单,最小化所有者隐藏所有拥有的窗体的任务栏按钮,只留下所有者的任务栏按钮可见。

(c) Chris Sell的"Windows Forms 2.0编程“,Michael Weinhardt。

票数 16
EN

Stack Overflow用户

发布于 2010-01-11 23:21:30

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

运行TestApp,显示newform.ShowDialog(),在任务栏或快速启动工具栏上单击“显示桌面”,单击任务栏上的TestApp。它展示了主观世界。你必须做一个Alt-Tab才能到达你的新表格。

VS

运行TestApp,显示newform.ShowDialog(this),在任务栏或快速启动工具栏上单击“显示桌面”,单击任务栏上的TestApp。上面显示的是新形式。

票数 26
EN

Stack Overflow用户

发布于 2009-05-03 14:45:22

“当前活动窗口”通常指的是前景窗口,但只有在它属于当前线程的情况下--参见MSDN中的GetActiveWindow

(实际信息在社区内容中,但注释是正确的,没有“每个线程活动窗口”,AFAIK)。

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

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

作为一个小麻烦,最初的立场通常是不正确或误导。

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

然而,这在技术上是可能的,而且很有可能发生,如果您打开对话框响应某些自动化,外部消息等。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/816885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档