簡體   English   中英

c#中ShowDialog()和ShowDialog(IWin32Window)有什么區別?

[英]What's difference between ShowDialog() and ShowDialog(IWin32Window) in c#?

兩個ShowDialog(); ShowDialog(IWin32Window); 似乎對我做同樣的事情。 文檔也不是很清楚。

我被告知ShowDialog(IWin32Window); 將確保對話框窗口位於作為所有者窗口傳入的內容之上。

MSDN文檔沒有提到這一點,所以感覺有點像黑魔法。

http://msdn.microsoft.com/en-us/library/w61zzfwe.aspx非常清楚該參數代表了所有者窗口。 這就是所有者窗口的行為 - 它保留在其子項之后,並且不會關閉而使其子項仍然顯示。

調用ShowDialog()時,當前活動窗口成為對話框的所有者。 如果要指定特定所有者,請使用此方法的其他版本(ShowDialog(IWin32Window))。

這在MSDN文檔中說明。

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

在內部, ShowDialog()使用null參數調用ShowDialog(IWin32Window) 如果參數不為null,則將其設置為表單的所有者。 如果owner為null,它將使用GetActiveWindow()IntPtr獲取到活動窗口並將其用作所有者。 您可以使用ILSpy自行查看

.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。

frm2.ShowDialog()使frm2成為模型對話框,除非我們關閉frm2的實例,否則我們無法在form1上的任何地方單擊。

frm2.show()沒有這樣的限制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM