ToolStrip 控制項架構

ToolStripToolStripItem 類別提供彈性、可延伸的系統來顯示工具列、狀態及功能表項。 這些類別全都包含在 System.Windows.Forms 命名空間中,而且它們通常會以 "ToolStrip" 前置詞 (例如 ToolStripOverflow) 或 "Strip" 後置詞 (例如 MenuStrip) 命名。

ToolStrip

下列主題描述 ToolStrip 及其衍生自它的控制項。

ToolStripMenuStripStatusStripContextMenuStrip 的抽象基底類別。 下列物件模型顯示 ToolStrip 繼承階層。

顯示 ToolStrip 物件模型的圖表。

您可以透過 Items 集合存取 ToolStrip 中的所有項目。 您可以透過 DropDownItems 集合存取 ToolStripDropDownItem 中的所有項目。 在衍生自 ToolStrip 的類別中,您也可以使用 DisplayedItems 屬性只存取目前顯示的項目。 這些是目前不在溢位功能表中的項目。

下列項目特別設計為在所有方向中順暢地與 ToolStripSystemRendererToolStripProfessionalRenderer 搭配運作。 預設情況下,它們在設計時可用於 ToolStrip 控制項:

MenuStrip 是取代 MainMenu 的最上層容器。 它也提供重要處理和多個文件介面 (MDI) 功能。 在功能上,ToolStripDropDownItemToolStripMenuItem 會與 MenuStrip 搭配運作,不過它們衍生自 ToolStripItem

下列項目特別設計為在所有方向中順暢地與 ToolStripSystemRendererToolStripProfessionalRenderer 搭配運作。 預設情況下,它們在設計時可用於 MenuStrip 控制項:

StatusStrip

StatusStrip 會取代 StatusBar 控制項。 StatusStrip 的特殊功能包括自訂表格配置、支援表單的大小調整和移動夾點,以及 Spring 屬性,讓 ToolStripStatusLabel 自動填滿可用空間。

下列項目特別設計為在所有方向中順暢地與 ToolStripSystemRendererToolStripProfessionalRenderer 搭配運作。 預設情況下,它們在設計時可用於 StatusStrip 控制項:

ContextMenuStrip

ContextMenuStrip 會取代 ContextMenu。 您可以將 ContextMenuStrip 與任何控制項產生關聯,而滑鼠右鍵會自動顯示操作功能表 (或捷徑功能表)。 您可以使用 Show 方法來以程式設計方式顯示 ContextMenuStripContextMenuStrip 支援可取消的 OpeningClosing 事件,以處理動態母體擴展和多次點選案例。 ContextMenuStrip 支援影像、功能表項檢查狀態、文字、存取鍵、捷徑及串聯功能表。

下列項目特別設計為在所有方向中順暢地與 ToolStripSystemRendererToolStripProfessionalRenderer 搭配運作。 預設情況下,它們在設計時可用於 ContextMenuStrip 控制項:

ToolStrip 一般功能

下列主題描述 ToolStrip 和衍生控制項的泛型特性和行為。

繪圖

您可以透過數種方式,以 ToolStrip 控制項執行自訂繪製。 如同其他 Windows Forms 控制項,ToolStripToolStripItem 都有可覆寫 OnPaint 方法和 Paint 事件。 如同一般繪製,座標系統相對於控制項的工作區:也就是說,控制項的左上角是 0, 0。 ToolStripItemPaint 事件和 OnPaint 方法的行為與其他控制項繪製事件類似。

ToolStrip 控制項也會透過 ToolStripRenderer 類別更精細地存取項目和容器的轉譯,此類別具有繪製背景、項目背景、項目影像、項目箭號、項目文字及 ToolStrip 框線的可覆寫方法。 這些方法的事件引數會公開數個屬性,例如您可以視需要調整的矩形、色彩及文字格式。

若要只調整項目繪製方式的幾個層面,您通常會覆寫 ToolStripRenderer

如果您要撰寫新項目並想要控制繪製的所有層面,請覆寫 OnPaint 方法。 從 OnPaint 內部,您可以使用來自 ToolStripRenderer 的方法。

根據預設,ToolStrip 會進行雙重緩衝處理,並利用 OptimizedDoubleBuffer 設定。

父系

容器所有權和父代的概念在 ToolStrip 控件中比在其他 Windows Forms 容器控制項中更為複雜。 這需要支援動態案例,例如溢位、跨多個 ToolStrip 項目共用下拉式項目,以及支援從控制項產生 ContextMenuStrip

下列清單描述與父代相關的成員,並說明其用法。

繼承控制項的行為

下列控制項會在繼承中使用時鎖定:

例如,使用上一個清單中的一個或多個控制項來建立新的 Windows Forms 應用程式。 將一個或多個控制項的存取修飾元設定為 publicprotected,然後建置專案。 新增一個從第一個表單繼承的表單,然後選取繼承的控制項。 控制項似乎已鎖定,就像其存取修飾元 private 一樣。

繼承的 ToolStripContainer 支援

ToolStripContainer 控制項支援有限的繼承案例,類似下列範例:

  1. 建立新的 Windows Form 應用程式。

  2. ToolStripContainer 加入表單。

  3. ToolStripContainer 的存取修飾元設定為 publicprotected

  4. ToolStripMenuStripContextMenuStrip 控制項的任何組合新增至 ToolStripContainerToolStripPanel區域。

  5. 組建專案。

  6. 新增從第一個表單繼承的表單。

  7. 選取表單上的已繼承 ToolStripContainer

子控制項的繼承行為

完成上述步驟之後,會發生下列繼承的行為:

部分信任

部分信任下 ToolStrip 的限制旨在防止意外輸入未經授權的人員或服務可能使用的個人資訊。 保護措施如下:

  • ToolStripDropDown 控制項需要 AllWindows 才能在 ToolStripControlHost 中顯示項目。 這同時適用於 ToolStripTextBoxToolStripComboBoxToolStripProgressBar,以及使用者建立的控制項等內建控制項。 如果不符合此需求,則不會顯示這些項目。 不會擲回任何例外狀況。

  • 不允許將 AutoClose 屬性設定為 false,而且會忽略可取消 Closing 事件參數。 如此一來,不需要關閉下拉式項目,就不可能輸入多個按鍵輸入。 如果不符合此需求,則不會顯示這類項目。 不會擲回任何例外狀況。

  • 如果事件發生在 AllWindows 以外的部分信任內容中,則不會引發許多按鍵輸入處理事件。

  • 未授與 AllWindows 時,不會處理存取金鑰。

使用方式

下列使用模式與 ToolStrip 版面配置、鍵盤互動及使用者行為有關:

鍵盤互動

存取金鑰

結合或遵循 ALT 鍵,存取鍵是使用鍵盤啟用控制項的其中一種方式。 ToolStrip 同時支援明確和隱含存取金鑰。 明確定義會使用字母前面的 & 符號字元。 隱含定義會使用演算法,根據指定 Text 屬性中的字元順序,嘗試尋找相符的項目。

快速鍵

MenuStrip 使用的快速鍵會使用 Keys 列舉的組合,定義快速鍵 (非特定順序)。 您也可以使用 ShortcutKeyDisplayString 屬性來僅顯示含有文字的快速鍵,例如顯示 "Del" 而不是 "Delete"。

ALT 鍵會啟動 MainMenuStrip 所指向的 MenuStrip。 從該處,CTRL+TAB 在 ToolStripPanel 內的 ToolStrip 控制項之間瀏覽。 數字鍵台上的 TAB 鍵和箭頭鍵會在 ToolStrip 中的項目之間瀏覽。 特殊演算法會處理溢位區域中的瀏覽。 SPACEBAR 會選取 ToolStripButtonToolStripDropDownButtonToolStripSplitButton

焦點和驗證

由 ALT 鍵啟動時,MenuStripToolStrip 通常不會從目前擁有焦點的控制項中移除焦點。 如果控制項裝載於 MenuStripMenuStrip 的下拉式清單中,當使用者按下 TAB 鍵時,控制項會取得焦點。 一般而言,GotFocusLostFocusEnterLeave 事件在鍵盤啟動時,可能不會引發 MenuStrip 事件。 在這種情況下,請改用 MenuActivateMenuDeactivate 事件。

根據預設,CausesValidationfalse。 在您的表單上明確呼叫 Validate 以執行驗證。

版面配置

您可以使用 LayoutStyle 屬性來選擇 ToolStripLayoutStyle 的其中一個成員,來控制 ToolStrip 配置。

堆疊版面配置

堆疊是指將物品並排放置在 ToolStrip 的兩端。 下列清單描述堆疊配置。

堆疊版面配置的其他功能

Alignment 會決定項目對齊之 ToolStrip 的結尾。

當項目不符合 ToolStrip 時,會自動顯示溢位按鈕。 Overflow 屬性設定會視需要決定專案是否一律出現在溢位區域中,或永遠不顯示。

LayoutCompleted 事件中,您可以檢查 Placement 屬性,以判斷專案是否放在主要 ToolStrip、溢位 ToolStrip,或目前未顯示。 項目未顯示的典型原因是項目不符合主要 ToolStrip,且其 Overflow 屬性設定為 Never

ToolStrip 放入 ToolStripPanel 並將其 GripStyle 設為 Visible,使其可移動。

其他版面配置選項

其他版面配置選項是 FlowTable

流程配置

Flow 版面配置是 ContextMenuStripToolStripDropDownMenuToolStripOverflow 的預設值。 它類似於 FlowLayoutPanelFlow 版面設定的功能如下所示:

版面配置表格

Table 版面配置是 StatusStrip 的預設值。 類似於 TableLayoutPanelFlow 版面設定的功能如下所示:

ToolStripItem

下列主題描述 ToolStripItem 及其衍生自它的控制項。

ToolStripItem 是進入 ToolStrip 之所有項目的抽象基底類別。 下列物件模型顯示 ToolStripItem 繼承階層。

顯示 ToolStripItem 物件模型的圖表。

ToolStripItem 類別直接繼承自 ToolStripItem,或透過 ToolStripControlHostToolStripDropDownItem 間接繼承自 ToolStripItem

ToolStripItem 控制項必須包含在 ToolStripMenuStripStatusStripContextMenuStrip 中,而且無法直接新增至表單。 各種容器類別的設計目的是要包含適當的 ToolStripItem 控制項子集。

下表列出庫存 ToolStripItem 控制項及其外觀最佳的容器。 雖然任何 ToolStrip 項目都可以裝載在任何 ToolStrip 衍生容器中,但這些項目的設計目的是在下列容器中看起來最好:

注意

ToolStripDropDown 不會出現在設計工具工具箱中。

自主項目 ToolStrip MenuStrip ContextMenuStrip StatusStrip ToolStripDropDown
ToolStripButton .是
ToolStripComboBox .是 .是 .是 .是
ToolStripSplitButton .是 .是 .是
ToolStripLabel .是 .是 .是
ToolStripSeparator .是 .是 .是 .是
ToolStripDropDownButton .是 .是 .是
ToolStripTextBox .是 .是 .是 .是
ToolStripMenuItem .是 .是
ToolStripStatusLabel .是
ToolStripProgressBar .是 .是
ToolStripControlHost .是 .是 .是 Yes

ToolStripButton

ToolStripButtonToolStrip 的按鈕項目。 您可以使用各種框線樣式來顯示它,而且您可以使用它來表示和啟用操作狀態。 您也可以將它定義為預設具有焦點。

ToolStripLabel

ToolStripLabel 會在 ToolStrip 控制項中提供標籤功能。 ToolStripLabel 就像預設不會取得焦點的 ToolStripButton,而且不會轉譯為已推送或反白顯示。

ToolStripLabel 作為託管的項目支援存取金鑰。

使用 ToolStripLabel 上的 LinkColorLinkVisitedLinkBehavior 屬性來支援 ToolStrip 中的連結控制項。

ToolStripStatusLabel

ToolStripStatusLabel 是專為在 StatusStrip 中使用的 ToolStripLabel 版本所設計。 特殊功能包括 BorderStyleBorderSidesSpring

ToolStripSeparator

ToolStripSeparator 會根據方向,將垂直或水平線新增至工具列或功能表。 它提供項目之間的分組或區分,例如選單上的項目。

您可以從下拉式清單中選擇 ToolStripSeparator,以在設計階段新增。 不過,您也可以在設計工具範本節點或 Add 方法中輸入連字號 (-) 來自動建立 ToolStripSeparator

ToolStripControlHost

ToolStripControlHostToolStripComboBoxToolStripTextBoxToolStripProgressBar 的抽象基底類別。 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

ToolStripDropDownItemToolStripMenuItemToolStripDropDownButtonToolStripSplitButton 的抽象基底類別,可以直接裝載項目,或裝載下拉式容器中的其他項目。 您可以將 DropDown 屬性設定為 ToolStripDropDown,並設定 ToolStripDropDownItems 屬性,以執行此動作。 直接透過 DropDownItems 屬性存取這些下拉式項目。

ToolStripMenuItem

ToolStripMenuItem 是一種 ToolStripDropDownItem,可搭配 ToolStripDropDownMenuContextMenuStrip 來處理功能表的特殊醒目提示、版面配置和資料行排列。

ToolStripDropDownButton

ToolStripDropDownButton 看起來像 ToolStripButton,但當使用者按一下時,會顯示下拉式區域。 藉由設定 ShowDropDownArrow 屬性來隱藏或顯示下拉式箭號。 ToolStripDropDownButton 裝載 ToolStripOverflowButton,以便顯示讓 ToolStrip 溢位的項目。

ToolStripSplitButton

ToolStripSplitButton 結合按鈕和下拉式按鈕功能。

使用 DefaultItem 屬性,將所選下拉式項目的 Click 事件與按鈕上顯示的項目同步處理。

ToolStripItem 一般功能

ToolStripItem 提供下列繼承控制項的一般功能和選項:

  • 核心事件

  • 影像處理

  • 對齊方式

  • 文字和影像關聯性

  • 顯示樣式

核心事件

ToolStripItem 控制項會收到自己的點擊、滑鼠及繪製事件,而且也可以執行一些鍵盤前置處理。

影像處理

ImageImageAlignImageIndexImageKeyImageScaling 屬性與影像處理的各個層面有關。 透過直接設定這些屬性或設定僅執行階段的 ImageList 屬性,可以在 ToolStrip 控制項中使用影像。

影像縮放取決於屬性在 ToolStripToolStripItem中的互動,如下所示:

對齊方式

Alignment 屬性的值會決定項目出現在 ToolStrip 的結尾。 只有當 ToolStrip 的版面配置樣式設定為其中一個堆疊溢位值時,Alignment 屬性才有效。

項目按照項目在「項目」集合中出現的順序放置在 ToolStrip 上。 若要以程式設計方式變更項目配置的位置,請使用 Insert 方法來移動集合中的項目。 這個方法會移動項目,但不會複製它。

文字和影像關聯性

TextImageRelation 屬性會定義影像相對於 ToolStripItem 文字的相對位置。 缺少影像、文字或兩者的項目將被視為特殊案例,以便 ToolStripItem 不會為缺少的一個或多個元素顯示空白點。

顯示樣式

DisplayStyle 可讓您設定項目的「文字」和「影像」屬性值,同時只顯示您想要的內容。 這通常只會在不同內容中顯示相同項目時變更顯示樣式。

配件類別

提供各種其他功能的類別包括:

另請參閱