ToolStrip 控制項架構
更新:2007 年 11 月
ToolStrip 和 ToolStripItem 類別提供具彈性、可擴充的系統以顯示工具列、狀態和功能表項目。這些類別全部包含於 System.Windows.Forms 命名空間之內,而且通常以 "ToolStrip" 前置字元 (例如 ToolStripOverflow)或 "Strip" 後置字元 (例如 MenuStrip) 來命名。
ToolStrip
下列主題將說明 ToolStrip 和其所衍生的控制項。
ToolStrip 是 MenuStrip、StatusStrip 和 ContextMenuStrip 的抽象基底類別。下列物件模型將說明 ToolStrip 繼承階層架構 (Inheritance Hierarchy)。
ToolStrip 物件模型
您可以透過 Items 集合存取 ToolStrip 中的所有項目。您可以透過 DropDownItems 集合存取 ToolStripDropDownItem 中的所有項目。在衍生自 ToolStrip 的類別中,您也可以使用 DisplayedItems 屬性僅存取目前顯示的項目。這些就是目前不在溢位功能表中的項目。
下列項目是專門設計來緊密搭配所有方向的 ToolStripSystemRenderer 和 ToolStripProfessionalRenderer 使用。根據預設,它們可在 ToolStrip 控制項的設計階段中使用:
MenuStrip
MenuStrip 是取代 MainMenu 的最上層容器。它也提供了金鑰處理和多重文件介面 (MDI) 的功能。在功能上,ToolStripDropDownItem 和 ToolStripMenuItem 會與 MenuStrip 一起運作 (雖然它們皆衍生自 ToolStripItem)。
下列項目是專門設計來緊密搭配所有方向的 ToolStripSystemRenderer 和 ToolStripProfessionalRenderer 使用。根據預設,它們可在 MenuStrip 控制項的設計階段中使用:
StatusStrip
StatusStrip 用以取代 StatusBar 控制項。StatusStrip 的特殊功能包括自訂資料表配置、表單縮放與移動底框,以及允許 ToolStripStatusLabel 自動填滿可用空間的 Spring 屬性。
下列項目是專門設計來緊密搭配所有方向的 ToolStripSystemRenderer 和 ToolStripProfessionalRenderer 使用。根據預設,它們可在 StatusStrip 控制項的設計階段中使用:
ContextMenuStrip
ContextMenuStrip 用以取代 ContextMenu。您可以使 ContextMenuStrip 與任何控制項產生關聯,而且按一下滑鼠右鍵便會自動顯示內容功能表 (或快速鍵功能表)。您可以使用 Show 方法,以程式設計的方式顯示 ContextMenuStrip。ContextMenuStrip 支援可取消的 Opening 和 Closing 事件,以處理動態擴展及按多次案件的案例。ContextMenuStrip 支援影像、功能表項目核取狀態、文字、便捷鍵 (Access Key)、快速鍵和串聯功能表。
下列項目是專門設計來緊密搭配所有方向的 ToolStripSystemRenderer 和 ToolStripProfessionalRenderer 使用。根據預設,它們可在 ContextMenuStrip 控制項的設計階段中使用:
ToolStrip 的一般功能
下列主題將說明 ToolStrip 及衍生之控制項的一般功能和行為。
繪製
您可以使用數種方法在 ToolStrip 控制項中自訂繪製。如同使用其他 Windows Form 控制項,ToolStrip 和 ToolStripItem 皆具有可覆寫的 OnPaint 方法和 Paint 事件。如同使用一般的繪製,座標系統是相對於控制項的工作區 (Client Area),亦即控制項的左上角為 (0, 0)。ToolStripItem 的 Paint 事件和 OnPaint 方法和其他控制項的繪製事件一樣。
ToolStrip 控制項可以經由 ToolStripRenderer 類別,針對項目和容器之呈現,提供更細微的存取方式。該類別具有可覆寫的方法,以繪製 ToolStrip 的背景 (Background)、項目背景、項目影像、項目箭號、項目文字和邊框。這些方法的事件引數會公開矩形、色彩和文字格式等數種屬性,讓您可以視需要進行調整。
若要只調整如何繪製項目的部分層面,通常只要覆寫 ToolStripRenderer。
如果您打算撰寫新的項目,而且想要控制繪製的所有層面,請覆寫 OnPaint 方法。在 OnPaint 中,您可以使用來自 ToolStripRenderer 的方法。
根據預設,ToolStrip 為雙重緩衝 (利用 OptimizedDoubleBuffer 設定)。
父代設定
在 ToolStrip 控制項中之容器擁有權和父代設定的概念遠較在其他 Windows Forms 容器控制項中複雜。對支援動態案例 (例如:溢位)、跨多個 ToolStrip 項目共用下拉式項目,以及支援從控制項產生 ContextMenuStrip 而言,這是必要的。
下列清單將說明父代設定的相關成員,並說明其使用方式。
OwnerItem 會存取下拉式項目的來源項目。這與 SourceControl 類似,但不會傳回控制項,而是傳回 ToolStripItem。
當多個控制項共用同一個 ContextMenuStrip 時,SourceControl 會判斷哪一個控制項是 ContextMenuStrip 的來源。
GetCurrentParent 是 Parent 屬性的唯讀存取子 (Accessor)。父代與擁有人的不同在於,父代表示傳回之目前顯示項目的 ToolStrip,該項目可能位在溢位區域中。
Owner 將傳回其 Items 集合包含目前 ToolStripItem 的 ToolStrip。這是參考在最上層 ToolStrip 中之 ImageList 或其他屬性的最好方法,而不需要撰寫處理溢位的特殊程式碼。
繼承控制項的行為
每當在繼承中使用下列控制項時,便會被鎖定:
ToolStripPanel,其包含在 ToolStripContainer 的面板和個別的 ToolStripPanel 控制項中。
例如,使用在先前清單中的一或多個控制項,建立新的 Windows Forms 應用程式。將一或多個控制項的存取修飾詞 (Modifier) 設定為 public 或 protected,然後建置專案。加入繼承自第一個表單的表單,然後選取繼承的控制項。該控制項會顯示已鎖定,而行為方式如同其存取修飾詞為 private。
繼承的 ToolStripContainer 支援
ToolStripContainer 控制項支援有限制的繼承案例,類似於下列範例:
建立新的 Windows Form 應用程式。
將 ToolStripContainer 加入表單中。
將 ToolStripContainer 的存取修飾詞設定為 public 或 protected。
將 ToolStrip、MenuStrip 和 ContextMenuStrip 控制項的任何組合加入至 ToolStripContainer 的 ToolStripPanel 區域。
建置專案。
加入繼承自第一個表單的表單。
在表單上選取繼承的 ToolStripContainer。
子控制項所繼承的行為
在完成先前的步驟之後,便會發生下列繼承的行為:
在設計工具中,該控制項會以繼承的圖示顯示。
ToolStripPanel 控制項會被鎖定,因此您無法選取或重新整理其內容。
您可以將控制項加入至 ToolStripContentPanel、移動控制項及產生 ToolStripContentPanel 的子控制項。
在建置該表單之後,便會保存您的變更。
注意事項: 從所有屬於 ToolStripContainer 的 ToolStripPanel 控制項中,移除存取修飾詞。ToolStripContainer 的存取修飾詞將管理整個控制項。
部分信任
部分信任下的 ToolStrip 限制,是為了避免不會因為不慎輸入了個人資訊,而導致未經授權的人員或服務使用這些資訊。預防措施如下:
ToolStripDropDown 控制項需要 AllWindows,才能在 ToolStripControlHost 中顯示項目。這項需求同時適用於內建控制項 (例如:ToolStripTextBox、ToolStripComboBox 和 ToolStripProgressBar) 及使用者建立的控制項。如果未符合這項需求,便不會顯示這些項目。不會擲回例外狀況。
不允許將 AutoClose 屬性設定為 false,並且忽略可取消的 Closing 事件參數。如此將造成無法在不關閉下拉式項目的情況下,輸入一個以上的按鍵。如果未符合這項需求,便不會顯示這些項目。不會擲回例外狀況。
如果發生在部分信任的內容中,而非在 AllWindows 中,許多按鍵處理事件將不會被引發。
當未授與 AllWindows 時,將不會處理便捷鍵。
使用方式
下列使用模式與 ToolStrip 配置、鍵盤互動和使用者行為具有關聯性:
已加入 ToolStripPanel 中
ToolStrip 的位置可以在 ToolStripPanel 中或跨 ToolStripPanel 重新調整。Dock 屬性會被忽略,而且如果 Stretch 屬性為 false,ToolStrip 的大小將調整成已加入至 ToolStripPanel 之項目的大小。一般而言,ToolStrip 不會加入定位順序。
停駐
ToolStrip 會放置於固定位置之容器的其中一側,而且其大小會展開以涵蓋整個所停駐的邊緣。一般而言,ToolStrip 不會加入定位順序。
絕對位置
鍵盤互動
便捷鍵
結合或跟隨 ALT 鍵,便捷鍵是一種使用鍵盤來啟動控制項的方式。ToolStrip 同時支援明確和隱含便捷鍵。明確定義會在字母前使用連字號 (&) 字元。隱含定義會使用演算法,嘗試根據所指定之 Text 屬性中的字元順序,尋找相符的項目。
快速鍵
MenuStrip 所使用的快速鍵是使用無特定順序之 Keys 列舉型別 (Enumeration) 的組合進行定義。您也可以使用 ShortcutKeyDisplayString 屬性,僅以文字顯示快速鍵 (例如:顯示 "Del" 而不顯示 "Delete")。
巡覽
ALT 鍵會啟動 MainMenuStrip 所指向的 MenuStrip。從這裡開始,可以使用 CTRL+TAB 在 ToolStripPanel 中的 ToolStrip 控制項之間進行巡覽。也可以使用 TAB 鍵和數字鍵台上的方向鍵在 ToolStrip 中的項目之間進行巡覽。特殊的演算法可處理在溢位區域中的巡覽。空格鍵則會選取 ToolStripButton、ToolStripDropDownButton 或 ToolStripSplitButton。
焦點 (Focus) 和驗證
當透過 ALT 鍵啟動時,通常 MenuStrip 或 ToolStrip 不會取得焦點,也不會將焦點從目前具有焦點的控制項中移除。如果控制項裝載在 MenuStrip 或下拉式 MenuStrip 中,則當使用者按下 TAB 鍵時,該控制項將會取得焦點。一般來說,當透過鍵盤啟動 MenuStrip 的 GotFocus、LostFocus、Enter 和 Leave 事件時,可能不會引發這些事件。在這些情況下,請改用 MenuActivate 和 MenuDeactivate 事件。
CausesValidation 是預設值為 false。在表單上明確呼叫 Validate,以執行驗證。
配置
您可以透過使用 LayoutStyle 屬性選擇 ToolStripLayoutStyle 的其中一個成員,控制 ToolStrip 配置。
堆疊配置
堆疊是在 ToolStrip 的兩端將項目一個接著一個排列。下列清單將說明堆疊配置。
StackWithOverflow 為預設值。這個設定會造成 ToolStrip 根據 Orientation 屬性自動更改其配置,以處理拖曳和停駐案例。
VerticalStackWithOverflow 會呈現垂直並排的 ToolStrip 項目。
HorizontalStackWithOverflow 會呈現水平並排的 ToolStrip 項目。
堆疊配置的其他功能
Alignment 將決定項目要對齊 ToolStrip 的哪一端。
當項目在 ToolStrip 中不符合時,便會自動出現溢位按鈕。Overflow 屬性設定將視需要決定項目永遠或永不出現在溢位區域中。
在 LayoutCompleted 事件中,您可以檢查 Placement 屬性,以決定將項目放置在主 ToolStrip 或溢位 ToolStrip 上,或者目前完全不顯示。某個項目未顯示的一般原因是因為該項目不適合主要 ToolStrip 而且它的 Overflow 屬性設定為 Never。
透過將其放置在 ToolStripPanel 中並將其 GripStyle 設定為 Visible,即可使 ToolStrip 移動。
其他配置選項
流程配置
Flow 配置是 ContextMenuStrip、ToolStripDropDownMenu 和 ToolStripOverflow 的預設值。此配置與 FlowLayoutPanel 類似。Flow 配置的功能說明如下:
FlowLayoutPanel 的所有功能會透過 LayoutSettings 屬性公開。您必須將 LayoutSettings 類別轉型為 FlowLayoutSettings 類別。
Alignment 屬性則會被忽略。
在 LayoutCompleted 事件中,您可以檢查 Placement 屬性,以判斷項目已放置或不適合放置在主 ToolStrip 上。
由於不會呈現底框,因此無法移動在 ToolStripPanel 中配置樣式為 Flow 的 ToolStrip。
表格配置
Table 配置是 StatusStrip 的預設值。此配置與 TableLayoutPanel 類似。Flow 配置的功能說明如下:
TableLayoutPanel 的所有功能會透過 LayoutSettings 屬性公開。您必須將 LayoutSettings 類別轉型為 TableLayoutSettings 類別。
Alignment 屬性則會被忽略。
在 LayoutCompleted 事件中,您可以檢查 Placement 屬性,以判斷項目已放置或不適合放置在主 ToolStrip 上。
由於不會呈現底框,因此無法移動在 ToolStripPanel 中配置樣式為 Table 的 ToolStrip。
ToolStripItem
下列主題將說明 ToolStripItem 和其所衍生的控制項。
ToolStripItem 是放置在 ToolStrip 中之所有項目的抽象基底類別。下列物件模型將說明 ToolStripItem 繼承階層架構 (Inheritance Hierarchy)。
ToolStripItem 物件模型
ToolStripItem 類別可以直接繼承自 ToolStripItem,或者透過 ToolStripControlHost 或 ToolStripDropDownItem 間接繼承自 ToolStripItem。
ToolStripItem 控制項必須要包含於 ToolStrip、MenuStrip、StatusStrip 或 ContextMenuStrip 之中,而不能直接加入表單中。各種容器類別的設計是用來包含適當的 ToolStripItem 控制項子集合。
下表列出了內建 ToolStripItem 控制項以及可提供控制項最佳顯示效果的容器。雖然任何 ToolStrip 項目皆可裝載於所有 ToolStrip 衍生容器中,但這些項目在以下容器中會有最佳的顯示效果:
注意事項: |
---|
設計工具箱中並不會出現 ToolStripDropDown。 |
包含的項目 |
ToolStrip |
MenuStrip |
ContextMenuStrip |
StatusStrip |
ToolStripDropDown |
---|---|---|---|---|---|
是 |
否 |
否 |
否 |
是 |
|
是 |
是 |
是 |
否 |
是 |
|
是 |
否 |
否 |
是 |
是 |
|
是 |
否 |
否 |
是 |
是 |
|
是 |
是 |
是 |
否 |
是 |
|
是 |
否 |
否 |
是 |
是 |
|
是 |
是 |
是 |
否 |
是 |
|
否 |
是 |
是 |
否 |
否 |
|
否 |
否 |
否 |
是 |
否 |
|
是 |
否 |
否 |
是 |
否 |
|
是 |
是 |
否 |
是 |
是 |
ToolStripButton
ToolStripButton 是 ToolStrip 的按鈕項目。您可以使用各種框線樣式來顯示它,而且可以使用它來表示和啟動操作狀態。您也可以將它定義為預設便取得焦點。
ToolStripLabel
ToolStripLabel 會在 ToolStrip 控制項中提供標籤功能。ToolStripLabel 與 ToolStripButton 類似,預設不會取得焦點,而且不會呈現為已按下或已反白。
ToolStripLabel 如同裝載項目 (Hosted Item),皆支援便捷鍵。
在 ToolStripLabel 上使用 LinkColor、LinkVisited 和 LinkBehavior 屬性,以支援 ToolStrip 中的連結控制。
ToolStripStatusLabel
ToolStripStatusLabel 是 ToolStripLabel 的一種版本,特別針對在 StatusStrip 中使用而設計。特殊功能包括 BorderStyle、BorderSides 和 Spring。
ToolStripSeparator
ToolStripSeparator 會根據方向在工具列或功能表中加入垂直線或水平線。它可以組成項目群組或區別項目,如同功能表上的項目。
透過從下拉式清單中選擇,即可在設計階段加入 ToolStripSeparator。但是,您也可以透過在設計工具範本節點或 Add 方法中輸入連字號 (-),自動建立 ToolStripSeparator。
ToolStripControlHost
ToolStripControlHost 是 ToolStripComboBox、ToolStripTextBox 和 ToolStripProgressBar 的抽象基底類別。ToolStripControlHost 可以用兩種方式裝載其他控制項 (包括自訂控制項):
使用衍生自 Control 的類別來建構 ToolStripControlHost。若要完整存取裝載控制項 (Hosted Control) 和屬性,您必須將 Control 屬性轉換回該屬性所代表的實質類別。
擴充 ToolStripControlHost,並在繼承類別的預設建構函式中,呼叫用以傳遞 Control 衍生類別的基底類別 (Base Class) 建構函式。這個選項可讓您包裝通用控制項的方法和屬性,以便於在 ToolStrip 之中進行存取。
ToolStripComboBox
ToolStripComboBox 是為了要在 ToolStrip 中裝載而最佳化的 ComboBox。裝載控制項之屬性和事件的子集會在 ToolStripComboBox 層級公開,但是基礎 ComboBox 控制項可透過 ComboBox 屬性完整存取。
ToolStripTextBox
ToolStripTextBox 是為了要在 ToolStrip 中裝載而最佳化的 TextBox。裝載控制項之屬性和事件的子集會在 ToolStripTextBox 層級公開,但是基礎 TextBox 控制項可透過 TextBox 屬性完整存取。
ToolStripProgressBar
ToolStripProgressBar 是為了要在 ToolStrip 中裝載而最佳化的 ProgressBar。裝載控制項之屬性和事件的子集會在 ToolStripProgressBar 層級公開,但是基礎 ProgressBar 控制項可透過 ProgressBar 屬性完整存取。
ToolStripDropDownItem
ToolStripDropDownItem 是 ToolStripMenuItem、ToolStripDropDownButton 和 ToolStripSplitButton 的抽象基底類別,可以直接裝載項目或裝載在下拉式容器中的其他項目。其做法為,將 DropDown 屬性設為 ToolStripDropDown,然後再設定 ToolStripDropDown 的 Items 屬性。您可以直接透過 DropDownItems 屬性,存取這些下拉式項目。
ToolStripMenuItem
ToolStripMenuItem 是一個 ToolStripDropDownItem,其使用 ToolStripDropDownMenu 和 ContextMenuStrip 以處理功能表的特殊反白顯示、配置及資料行排列。
ToolStripDropDownButton
ToolStripDropDownButton 與 ToolStripButton 類似,但使用者按下它時將會顯示下拉式區域。透過設定 ShowDropDownArrow 屬性,隱藏或顯示下拉式箭頭。ToolStripDropDownButton 裝載了 ToolStripOverflowButton,用以顯示 ToolStrip 溢位的項目。
ToolStripSplitButton
ToolStripSplitButton 結合按鈕和下拉式按鈕的功能。
使用 DefaultItem 屬性,將所選擇之下拉式項目的 Click 事件與按鈕上所顯示的項目進行同步。
ToolStripItem 的一般功能
ToolStripItem 提供下列一般功能和選項給繼承的控制項:
核心事件
影像處理
對齊方式
文字和影像的關聯性
顯示樣式
核心事件
ToolStripItem 控制項會接收自己的點選、滑鼠和繪製事件,並且也可以執行某些鍵盤前置處理。
影像處理
Image、ImageAlign、ImageIndex、ImageKey 和 ImageScaling 屬性與影像處理的各種層面有關。您可以透過直接設定這些屬性,或者設定僅限執行階段執行的 ImageList 屬性,使用 ToolStrip 控制項中的影像。
影像縮放是由 ToolStrip 和 ToolStripItem 中的屬性互動所決定,如下所示:
ImageScalingSize 是最終影像的比例,由該影像的 ImageScaling 設定和容器的 AutoSize 設定構成的組合所決定。
如果 AutoSize 為 true (預設值) 且 ToolStripItemImageScaling 為 SizeToFit,則不會發生任何的影像縮放,而且 ToolStrip 大小會是最大項目的大小或是規定大小的最小值。
如果 AutoSize 為 false 且 ToolStripItemImageScaling 為 None,則不會發生影像及 ToolStrip 的縮放。
對齊方式
Alignment 屬性的值將決定 ToolStrip 的結尾,亦即項目顯示的地方。只有當 ToolStrip 的配置樣式設定為其中一個堆疊溢位 (Stack Overflow) 值時,Alignment 屬性才會有作用。
這些項目會根據它們在 Items 集合中出現的順序,放置在 ToolStrip 上。若要以程式設計的方式變更項目的配置位置,請使用 Insert 方法來移動集合中的項目。這個方法會移動項目,但不會複製項目。
文字和影像的關聯性
TextImageRelation 屬性可定義影像的相對位置 (相對於 ToolStripItem 上的文字)。缺少影像、文字或兩者的項目會被視為特殊狀況,因此 ToolStripItem 不會針對缺少的項目顯示空白位置。
顯示樣式
DisplayStyle 可以讓您設定項目之 Text 和 Image 屬性的值,以便只顯示您想要的內容。這個功能通常只用於在不同內容中顯示同一個項目時,變更顯示樣式。
附屬類別
提供其他各種功能的類別,包括:
ToolStripManager 支援整個應用程式的 ToolStrip 相關工作,例如:合併、設定和產生器選項。
ToolStripRenderer 可以讓您輕鬆地將特定的樣式或主題套用至 ToolStrip。
ToolStripProfessionalRenderer 會根據可取代的色彩表 (ProfessionalColorTable) 建立畫筆和筆刷。
ToolStripSystemRenderer 會將系統色彩和平面視覺化樣式套用至 ToolStrip 應用程式。
ToolStripContainer 與 SplitContainer 類似。它使用四個停駐側邊面板 (ToolStripPanel 的執行個體 (Instance)) 和一個中央面板 (ToolStripContentPanel 的執行個體),以建立一般的排列方式。您無法移除側邊面板,但可以將它們隱藏起來。但是您無法移除或隱藏中央面板。您可以在側邊面板中排列一或多個 ToolStrip、MenuStrip 或 StatusStrip 控制項,並使用中央面板放置其他控制項。ToolStripContentPanel 也提供取得表單主體中之產生器支援的方法,以得到一致的外觀。ToolStripContainer 不支援多重文件介面 (MDI)。
ToolStripPanel 提供移動與排列 ToolStrip 控制項的空間。如果選擇這種方式,您只可以使用一個面板,而且 ToolStripPanel 可以在 MDI 案例中正常運作。
請參閱
概念
參考
ToolStrip 控制項概觀 (Windows Form)