ToolStrip 控制項架構
ToolStrip 和 ToolStripItem 類別提供彈性、可延伸的系統來顯示工具列、狀態及功能表項。 這些類別全都包含在 System.Windows.Forms 命名空間中,而且它們通常會以 "ToolStrip" 前置詞 (例如 ToolStripOverflow) 或 "Strip" 後置詞 (例如 MenuStrip) 命名。
ToolStrip
下列主題描述 ToolStrip 及其衍生自它的控制項。
ToolStrip 是 MenuStrip、StatusStrip 及 ContextMenuStrip 的抽象基底類別。 下列物件模型顯示 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 的特殊功能包括自訂表格配置、支援表單的大小調整和移動夾點,以及 Spring
屬性,讓 ToolStripStatusLabel 自動填滿可用空間。
下列項目特別設計為在所有方向中順暢地與 ToolStripSystemRenderer 和 ToolStripProfessionalRenderer 搭配運作。 預設情況下,它們在設計時可用於 StatusStrip 控制項:
ContextMenuStrip
ContextMenuStrip 會取代 ContextMenu。 您可以將 ContextMenuStrip 與任何控制項產生關聯,而滑鼠右鍵會自動顯示操作功能表 (或捷徑功能表)。 您可以使用 Show 方法來以程式設計方式顯示 ContextMenuStrip。 ContextMenuStrip 支援可取消的 Opening 和 Closing 事件,以處理動態母體擴展和多次點選案例。 ContextMenuStrip 支援影像、功能表項檢查狀態、文字、存取鍵、捷徑及串聯功能表。
下列項目特別設計為在所有方向中順暢地與 ToolStripSystemRenderer 和 ToolStripProfessionalRenderer 搭配運作。 預設情況下,它們在設計時可用於 ContextMenuStrip 控制項:
ToolStrip 一般功能
下列主題描述 ToolStrip 和衍生控制項的泛型特性和行為。
繪圖
您可以透過數種方式,以 ToolStrip 控制項執行自訂繪製。 如同其他 Windows Forms 控制項,ToolStrip 和 ToolStripItem 都有可覆寫 OnPaint
方法和 Paint
事件。 如同一般繪製,座標系統相對於控制項的工作區:也就是說,控制項的左上角是 0, 0。 ToolStripItem 的 Paint
事件和 OnPaint
方法的行為與其他控制項繪製事件類似。
ToolStrip 控制項也會透過 ToolStripRenderer 類別更精細地存取項目和容器的轉譯,此類別具有繪製背景、項目背景、項目影像、項目箭號、項目文字及 ToolStrip 框線的可覆寫方法。 這些方法的事件引數會公開數個屬性,例如您可以視需要調整的矩形、色彩及文字格式。
若要只調整項目繪製方式的幾個層面,您通常會覆寫 ToolStripRenderer。
如果您要撰寫新項目並想要控制繪製的所有層面,請覆寫 OnPaint
方法。 從 OnPaint
內部,您可以使用來自 ToolStripRenderer 的方法。
根據預設,ToolStrip 會進行雙重緩衝處理,並利用 OptimizedDoubleBuffer 設定。
父系
容器所有權和父代的概念在 ToolStrip 控件中比在其他 Windows Forms 容器控制項中更為複雜。 這需要支援動態案例,例如溢位、跨多個 ToolStrip 項目共用下拉式項目,以及支援從控制項產生 ContextMenuStrip。
下列清單描述與父代相關的成員,並說明其用法。
OwnerItem 存取下拉式項目來源的項目。 這類似於 SourceControl,但它不會傳回控制項,而是傳回 ToolStripItem。
當多個控制項共用相同的 ContextMenuStrip 時,SourceControl 會決定哪個控制項是 ContextMenuStrip 的來源。
GetCurrentParent 是 Parent 屬性的唯讀存取子。 父代與所有者不同,因為父代表示顯示項目所在的目前 ToolStrip,這可能位於溢位區域中。
Owner 傳回 ToolStrip,其項目集合包含目前 ToolStripItem。 這是參考最上層 ToolStrip 中 ImageList 或其他屬性的最佳方式,而不需要撰寫特殊程式碼來處理溢位。
繼承控制項的行為
下列控制項會在繼承中使用時鎖定:
ToolStripPanel 其中包含 ToolStripContainer 中的面板,以及個別的 ToolStripPanel 控制項。
例如,使用上一個清單中的一個或多個控制項來建立新的 Windows Forms 應用程式。 將一個或多個控制項的存取修飾元設定為 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 列舉的組合,定義快速鍵 (非特定順序)。 您也可以使用 ShortcutKeyDisplayString 屬性來僅顯示含有文字的快速鍵,例如顯示 "Del" 而不是 "Delete"。
導覽
ALT 鍵會啟動 MainMenuStrip 所指向的 MenuStrip。 從該處,CTRL+TAB 在 ToolStripPanel
內的 ToolStrip 控制項之間瀏覽。 數字鍵台上的 TAB 鍵和箭頭鍵會在 ToolStrip 中的項目之間瀏覽。 特殊演算法會處理溢位區域中的瀏覽。 SPACEBAR 會選取 ToolStripButton、ToolStripDropDownButton 或 ToolStripSplitButton。
焦點和驗證
由 ALT 鍵啟動時,MenuStrip 或 ToolStrip 通常不會從目前擁有焦點的控制項中移除焦點。 如果控制項裝載於 MenuStrip 或 MenuStrip 的下拉式清單中,當使用者按下 TAB 鍵時,控制項會取得焦點。 一般而言,GotFocus、LostFocus、Enter 及 Leave 事件在鍵盤啟動時,可能不會引發 MenuStrip 事件。 在這種情況下,請改用 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。
將 ToolStrip 放入 ToolStripPanel 並將其 GripStyle 設為 Visible,使其可移動。
其他版面配置選項
流程配置
Flow 版面配置是 ContextMenuStrip、ToolStripDropDownMenu 及 ToolStripOverflow 的預設值。 它類似於 FlowLayoutPanel。 Flow 版面設定的功能如下所示:
LayoutSettings 屬性會公開 FlowLayoutPanel 的所有功能。 您必須將 LayoutSettings 類別轉換成 FlowLayoutSettings 類別。
忽略 Alignment 屬性。
在 LayoutCompleted 事件中,您可以檢查 Placement 屬性,以判斷項目是放在主要 ToolStrip 還是不符合。
不會轉譯底框,因此無法在 ToolStripPanel 中移動 Flow 版面配置樣式中的 ToolStrip。
版面配置表格
Table 版面配置是 StatusStrip 的預設值。 類似於 TableLayoutPanel。 Flow 版面設定的功能如下所示:
LayoutSettings 屬性會公開 TableLayoutPanel 的所有功能。 您必須將 LayoutSettings 類別轉換成 TableLayoutSettings 類別。
忽略 Alignment 屬性。
在 LayoutCompleted 事件中,您可以檢查 Placement 屬性,以判斷項目是放在主要 ToolStrip 還是不符合。
不會轉譯底框,因此無法在 ToolStripPanel 中移動 Table 版面配置樣式中的 ToolStrip。
ToolStripItem
下列主題描述 ToolStripItem 及其衍生自它的控制項。
ToolStripItem 是進入 ToolStrip 之所有項目的抽象基底類別。 下列物件模型顯示 ToolStripItem 繼承階層。
ToolStripItem 類別直接繼承自 ToolStripItem,或透過 ToolStripControlHost 或 ToolStripDropDownItem 間接繼承自 ToolStripItem。
ToolStripItem 控制項必須包含在 ToolStrip、MenuStrip、StatusStrip 或 ContextMenuStrip 中,而且無法直接新增至表單。 各種容器類別的設計目的是要包含適當的 ToolStripItem 控制項子集。
下表列出庫存 ToolStripItem 控制項及其外觀最佳的容器。 雖然任何 ToolStrip 項目都可以裝載在任何 ToolStrip 衍生容器中,但這些項目的設計目的是在下列容器中看起來最好:
注意
ToolStripDropDown 不會出現在設計工具工具箱中。
自主項目 | ToolStrip | MenuStrip | ContextMenuStrip | StatusStrip | ToolStripDropDown |
---|---|---|---|---|---|
ToolStripButton | 是 | 無 | 無 | 無 | .是 |
ToolStripComboBox | .是 | .是 | .是 | 無 | .是 |
ToolStripSplitButton | .是 | 無 | 無 | .是 | .是 |
ToolStripLabel | .是 | 無 | 無 | .是 | .是 |
ToolStripSeparator | .是 | .是 | .是 | 無 | .是 |
ToolStripDropDownButton | .是 | 無 | 無 | .是 | .是 |
ToolStripTextBox | .是 | .是 | .是 | 無 | .是 |
ToolStripMenuItem | 無 | .是 | .是 | 無 | 無 |
ToolStripStatusLabel | 無 | 無 | 無 | .是 | 無 |
ToolStripProgressBar | .是 | 無 | 無 | .是 | 無 |
ToolStripControlHost | .是 | .是 | 無 | .是 | Yes |
ToolStripButton
ToolStripButton 是 ToolStrip 的按鈕項目。 您可以使用各種框線樣式來顯示它,而且您可以使用它來表示和啟用操作狀態。 您也可以將它定義為預設具有焦點。
ToolStripLabel
ToolStripLabel 會在 ToolStrip 控制項中提供標籤功能。 ToolStripLabel 就像預設不會取得焦點的 ToolStripButton,而且不會轉譯為已推送或反白顯示。
ToolStripLabel 作為託管的項目支援存取金鑰。
使用 ToolStripLabel 上的 LinkColor、LinkVisited 及 LinkBehavior 屬性來支援 ToolStrip 中的連結控制項。
ToolStripStatusLabel
ToolStripStatusLabel 是專為在 StatusStrip 中使用的 ToolStripLabel 版本所設計。 特殊功能包括 BorderStyle、BorderSides 及 Spring。
ToolStripSeparator
ToolStripSeparator 會根據方向,將垂直或水平線新增至工具列或功能表。 它提供項目之間的分組或區分,例如選單上的項目。
您可以從下拉式清單中選擇 ToolStripSeparator,以在設計階段新增。 不過,您也可以在設計工具範本節點或 Add 方法中輸入連字號 (-) 來自動建立 ToolStripSeparator。
ToolStripControlHost
ToolStripControlHost 是 ToolStripComboBox、ToolStripTextBox 及 ToolStripProgressBar 的抽象基底類別。 ToolStripControlHost 可以透過兩種方式裝載其他控制項,包括自訂控制項:
使用衍生自 Control 的類別建構 ToolStripControlHost。 若要完整存取裝載的控制項和屬性,您必須將 Control 屬性轉換回它所代表的實際類別。
擴充 ToolStripControlHost,並在繼承類別的無參數建構函式中,呼叫基底類別建構函式,傳遞衍生自 Control 的類別。 這個選項可讓您包裝通用控制項方法和屬性,以便輕鬆存取 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 的版面配置樣式設定為其中一個堆疊溢位值時,Alignment 屬性才有效。
項目按照項目在「項目」集合中出現的順序放置在 ToolStrip 上。 若要以程式設計方式變更項目配置的位置,請使用 Insert 方法來移動集合中的項目。 這個方法會移動項目,但不會複製它。
文字和影像關聯性
TextImageRelation 屬性會定義影像相對於 ToolStripItem 文字的相對位置。 缺少影像、文字或兩者的項目將被視為特殊案例,以便 ToolStripItem 不會為缺少的一個或多個元素顯示空白點。
顯示樣式
DisplayStyle 可讓您設定項目的「文字」和「影像」屬性值,同時只顯示您想要的內容。 這通常只會在不同內容中顯示相同項目時變更顯示樣式。
配件類別
提供各種其他功能的類別包括:
ToolStripManager 支援整個應用程式的 ToolStrip 相關工作,例如合併、設定及轉譯器選項。
ToolStripRenderer 可讓您輕鬆地將特定樣式或主題套用至 ToolStrip。
ToolStripProfessionalRenderer 會根據可取代的色彩表建立畫筆和筆刷 (ProfessionalColorTable)。
ToolStripSystemRenderer 會將系統色彩和一般視覺樣式套用至 ToolStrip 應用程式。
ToolStripContainer 類似於 SplitContainer。 它使用四個停駐側面板 (ToolStripPanel 執行個體) 和一個中央面板 (ToolStripContentPanel 執行個體) 來建立一般排列。 您無法移除側面板,但可以隱藏它們。 您無法移除或隱藏中央面板。 您可以在側面板中排列一或多個 ToolStrip、MenuStrip 或 StatusStrip 控制項,也可以使用中央面板進行其他控制項。 ToolStripContentPanel 也提供讓轉譯器支援進入表單本文的方式,以取得一致的外觀。 ToolStripContainer 不支援多重文件介面 (MDI)。
ToolStripPanel 提供移動和排列 ToolStrip 控制項的空間。 如果您願意,您可以只使用一個面板,並且 ToolStripPanel 在 MDI 案例中效果很好。