c#中ShowDialog()和ShowDialog(IWin32Window)有什么区别?

时间:2011-09-16 18:55:29

标签: c# winforms

ShowDialog();ShowDialog(IWin32Window);似乎对我做同样的事情。文档也不是很清楚。

我被告知ShowDialog(IWin32Window);将确保对话窗口位于作为所有者窗口传入的内容之上。

MSDN文档没有提到这一点,所以感觉有点像黑魔法。

5 个答案:

答案 0 :(得分:9)

http://msdn.microsoft.com/en-us/library/w61zzfwe.aspx清楚地表明该参数代表了所有者窗口。这就是所有者窗口的行为 - 它留在孩子身后并且不会关闭,让孩子仍然显示。

答案 1 :(得分:5)

调用ShowDialog()时,当前活动窗口成为对话框的所有者。如果要指定特定所有者,请使用此方法的其他版本(ShowDialog(IWin32Window))。

这在MSDN文档中有说明。

http://msdn.microsoft.com/en-us/library/c7ykbedk.aspx

答案 2 :(得分:2)

内部ShowDialog()使用null参数调用ShowDialog(IWin32Window)。如果参数不为null,则将其设置为表单的所有者。如果owner为null,则会使用GetActiveWindow()向活动窗口获取IntPtr并将其用作所有者。您可以使用ILSpy自行查看。

答案 3 :(得分:1)

  

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

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


  

ShowDialog 显示新表单时,隐式关系是   在当前活动表单之间建立,称为所有者   形式和新形式,称为自有形式。这种关系   确保拥有的表单是活动表单并始终显示   所有者表单的顶部。

     

这种关系的一个特点是拥有的形式影响了   所有者表单的行为(使用 ShowDialog 时):

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

与ShowDialog方法不同,调用显示方法会   不建立隐含的所有者拥有关系。这意味着   任何一种形式都可以是当前活跃的形式。

     

没有隐含的所有者拥有的关系,所有者和拥有的表单   同样可以最小化,最大化或移动。如果用户关闭任何   除主要形式以外的形式,最近活跃的形式是   重新激活。

     

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

     

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

(c)Chris Sells的“Windows Forms 2.0 Programming”,Michael Weinhardt。

答案 4 :(得分:0)

frm2.ShowDialog()使frm2成为模型对话框,除非我们关闭frm2的实例,否则我们无法点击form1上的任何地方。

frm2.show()没有这样的限制。