共用方式為


ToolStrip 控制項架構

更新:2007 年 11 月

ToolStripToolStripItem 類別提供具彈性、可擴充的系統以顯示工具列、狀態和功能表項目。這些類別全部包含於 System.Windows.Forms 命名空間之內,而且通常以 "ToolStrip" 前置字元 (例如 ToolStripOverflow)或 "Strip" 後置字元 (例如 MenuStrip) 來命名。

ToolStrip

下列主題將說明 ToolStrip 和其所衍生的控制項。

ToolStripMenuStripStatusStripContextMenuStrip 的抽象基底類別。下列物件模型將說明 ToolStrip 繼承階層架構 (Inheritance Hierarchy)。

ToolStrip 物件模型

ToolStrip 物件模型

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

下列項目是專門設計來緊密搭配所有方向的 ToolStripSystemRendererToolStripProfessionalRenderer 使用。根據預設,它們可在 ToolStrip 控制項的設計階段中使用:

MenuStrip 是取代 MainMenu 的最上層容器。它也提供了金鑰處理和多重文件介面 (MDI) 的功能。在功能上,ToolStripDropDownItemToolStripMenuItem 會與 MenuStrip 一起運作 (雖然它們皆衍生自 ToolStripItem)。

下列項目是專門設計來緊密搭配所有方向的 ToolStripSystemRendererToolStripProfessionalRenderer 使用。根據預設,它們可在 MenuStrip 控制項的設計階段中使用:

StatusStrip

StatusStrip 用以取代 StatusBar 控制項。StatusStrip 的特殊功能包括自訂資料表配置、表單縮放與移動底框,以及允許 ToolStripStatusLabel 自動填滿可用空間的 Spring 屬性。

下列項目是專門設計來緊密搭配所有方向的 ToolStripSystemRendererToolStripProfessionalRenderer 使用。根據預設,它們可在 StatusStrip 控制項的設計階段中使用:

ContextMenuStrip

ContextMenuStrip 用以取代 ContextMenu。您可以使 ContextMenuStrip 與任何控制項產生關聯,而且按一下滑鼠右鍵便會自動顯示內容功能表 (或快速鍵功能表)。您可以使用 Show 方法,以程式設計的方式顯示 ContextMenuStripContextMenuStrip 支援可取消的 OpeningClosing 事件,以處理動態擴展及按多次案件的案例。ContextMenuStrip 支援影像、功能表項目核取狀態、文字、便捷鍵 (Access Key)、快速鍵和串聯功能表。

下列項目是專門設計來緊密搭配所有方向的 ToolStripSystemRendererToolStripProfessionalRenderer 使用。根據預設,它們可在 ContextMenuStrip 控制項的設計階段中使用:

ToolStrip 的一般功能

下列主題將說明 ToolStrip 及衍生之控制項的一般功能和行為。

繪製

您可以使用數種方法在 ToolStrip 控制項中自訂繪製。如同使用其他 Windows Form 控制項,ToolStripToolStripItem 皆具有可覆寫的 OnPaint 方法和 Paint 事件。如同使用一般的繪製,座標系統是相對於控制項的工作區 (Client Area),亦即控制項的左上角為 (0, 0)。ToolStripItem 的 Paint 事件和 OnPaint 方法和其他控制項的繪製事件一樣。

ToolStrip 控制項可以經由 ToolStripRenderer 類別,針對項目和容器之呈現,提供更細微的存取方式。該類別具有可覆寫的方法,以繪製 ToolStrip 的背景 (Background)、項目背景、項目影像、項目箭號、項目文字和邊框。這些方法的事件引數會公開矩形、色彩和文字格式等數種屬性,讓您可以視需要進行調整。

若要只調整如何繪製項目的部分層面,通常只要覆寫 ToolStripRenderer

如果您打算撰寫新的項目,而且想要控制繪製的所有層面,請覆寫 OnPaint 方法。在 OnPaint 中,您可以使用來自 ToolStripRenderer 的方法。

根據預設,ToolStrip 為雙重緩衝 (利用 OptimizedDoubleBuffer 設定)。

父代設定

ToolStrip 控制項中之容器擁有權和父代設定的概念遠較在其他 Windows Forms 容器控制項中複雜。對支援動態案例 (例如:溢位)、跨多個 ToolStrip 項目共用下拉式項目,以及支援從控制項產生 ContextMenuStrip 而言,這是必要的。

下列清單將說明父代設定的相關成員,並說明其使用方式。

繼承控制項的行為

每當在繼承中使用下列控制項時,便會被鎖定:

例如,使用在先前清單中的一或多個控制項,建立新的 Windows Forms 應用程式。將一或多個控制項的存取修飾詞 (Modifier) 設定為 public 或 protected,然後建置專案。加入繼承自第一個表單的表單,然後選取繼承的控制項。該控制項會顯示已鎖定,而行為方式如同其存取修飾詞為 private。

繼承的 ToolStripContainer 支援

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

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

  2. ToolStripContainer 加入表單中。

  3. ToolStripContainer 的存取修飾詞設定為 public 或 protected。

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

  5. 建置專案。

  6. 加入繼承自第一個表單的表單。

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

子控制項所繼承的行為

在完成先前的步驟之後,便會發生下列繼承的行為:

部分信任

部分信任下的 ToolStrip 限制,是為了避免不會因為不慎輸入了個人資訊,而導致未經授權的人員或服務使用這些資訊。預防措施如下:

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

  • 不允許將 AutoClose 屬性設定為 false,並且忽略可取消的 Closing 事件參數。如此將造成無法在不關閉下拉式項目的情況下,輸入一個以上的按鍵。如果未符合這項需求,便不會顯示這些項目。不會擲回例外狀況。

  • 如果發生在部分信任的內容中,而非在 AllWindows 中,許多按鍵處理事件將不會被引發。

  • 當未授與 AllWindows 時,將不會處理便捷鍵。

使用方式

下列使用模式與 ToolStrip 配置、鍵盤互動和使用者行為具有關聯性:

  • 已加入 ToolStripPanel

    ToolStrip 的位置可以在 ToolStripPanel 中或跨 ToolStripPanel 重新調整。Dock 屬性會被忽略,而且如果 Stretch 屬性為 false,ToolStrip 的大小將調整成已加入至 ToolStripPanel 之項目的大小。一般而言,ToolStrip 不會加入定位順序。

  • 停駐

    ToolStrip 會放置於固定位置之容器的其中一側,而且其大小會展開以涵蓋整個所停駐的邊緣。一般而言,ToolStrip 不會加入定位順序。

  • 絕對位置

    ToolStrip 與其他透過 Location 屬性放置的控制項類似,具有固定的大小,而且通常會加入定位順序。

鍵盤互動

便捷鍵

結合或跟隨 ALT 鍵,便捷鍵是一種使用鍵盤來啟動控制項的方式。ToolStrip 同時支援明確和隱含便捷鍵。明確定義會在字母前使用連字號 (&) 字元。隱含定義會使用演算法,嘗試根據所指定之 Text 屬性中的字元順序,尋找相符的項目。

快速鍵

MenuStrip 所使用的快速鍵是使用無特定順序之 Keys 列舉型別 (Enumeration) 的組合進行定義。您也可以使用 ShortcutKeyDisplayString 屬性,僅以文字顯示快速鍵 (例如:顯示 "Del" 而不顯示 "Delete")。

巡覽

ALT 鍵會啟動 MainMenuStrip 所指向的 MenuStrip。從這裡開始,可以使用 CTRL+TAB 在 ToolStripPanel 中的 ToolStrip 控制項之間進行巡覽。也可以使用 TAB 鍵和數字鍵台上的方向鍵在 ToolStrip 中的項目之間進行巡覽。特殊的演算法可處理在溢位區域中的巡覽。空格鍵則會選取 ToolStripButtonToolStripDropDownButtonToolStripSplitButton

焦點 (Focus) 和驗證

當透過 ALT 鍵啟動時,通常 MenuStripToolStrip 不會取得焦點,也不會將焦點從目前具有焦點的控制項中移除。如果控制項裝載在 MenuStrip 或下拉式 MenuStrip 中,則當使用者按下 TAB 鍵時,該控制項將會取得焦點。一般來說,當透過鍵盤啟動 MenuStripGotFocusLostFocusEnterLeave 事件時,可能不會引發這些事件。在這些情況下,請改用 MenuActivateMenuDeactivate 事件。

CausesValidation 是預設值為 false。在表單上明確呼叫 Validate,以執行驗證。

配置

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

堆疊配置

堆疊是在 ToolStrip 的兩端將項目一個接著一個排列。下列清單將說明堆疊配置。

堆疊配置的其他功能

Alignment 將決定項目要對齊 ToolStrip 的哪一端。

當項目在 ToolStrip 中不符合時,便會自動出現溢位按鈕。Overflow 屬性設定將視需要決定項目永遠或永不出現在溢位區域中。

LayoutCompleted 事件中,您可以檢查 Placement 屬性,以決定將項目放置在主 ToolStrip 或溢位 ToolStrip 上,或者目前完全不顯示。某個項目未顯示的一般原因是因為該項目不適合主要 ToolStrip 而且它的 Overflow 屬性設定為 Never

透過將其放置在 ToolStripPanel 中並將其 GripStyle 設定為 Visible,即可使 ToolStrip 移動。

其他配置選項

其他配置選項為 FlowTable

流程配置

Flow 配置是 ContextMenuStripToolStripDropDownMenuToolStripOverflow 的預設值。此配置與 FlowLayoutPanel 類似。Flow 配置的功能說明如下:

表格配置

Table 配置是 StatusStrip 的預設值。此配置與 TableLayoutPanel 類似。Flow 配置的功能說明如下:

ToolStripItem

下列主題將說明 ToolStripItem 和其所衍生的控制項。

ToolStripItem 是放置在 ToolStrip 中之所有項目的抽象基底類別。下列物件模型將說明 ToolStripItem 繼承階層架構 (Inheritance Hierarchy)。

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

ToolStripButton

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

ToolStripLabel

ToolStripLabel 會在 ToolStrip 控制項中提供標籤功能。ToolStripLabelToolStripButton 類似,預設不會取得焦點,而且不會呈現為已按下或已反白。

ToolStripLabel 如同裝載項目 (Hosted Item),皆支援便捷鍵。

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

ToolStripStatusLabel

ToolStripStatusLabelToolStripLabel 的一種版本,特別針對在 StatusStrip 中使用而設計。特殊功能包括 BorderStyleBorderSidesSpring

ToolStripSeparator

ToolStripSeparator 會根據方向在工具列或功能表中加入垂直線或水平線。它可以組成項目群組或區別項目,如同功能表上的項目。

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

ToolStripControlHost

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

ToolStripDropDownItemToolStripMenuItemToolStripDropDownButtonToolStripSplitButton 的抽象基底類別,可以直接裝載項目或裝載在下拉式容器中的其他項目。其做法為,將 DropDown 屬性設為 ToolStripDropDown,然後再設定 ToolStripDropDownItems 屬性。您可以直接透過 DropDownItems 屬性,存取這些下拉式項目。

ToolStripMenuItem

ToolStripMenuItem 是一個 ToolStripDropDownItem,其使用 ToolStripDropDownMenuContextMenuStrip 以處理功能表的特殊反白顯示、配置及資料行排列。

ToolStripDropDownButton

ToolStripDropDownButtonToolStripButton 類似,但使用者按下它時將會顯示下拉式區域。透過設定 ShowDropDownArrow 屬性,隱藏或顯示下拉式箭頭。ToolStripDropDownButton 裝載了 ToolStripOverflowButton,用以顯示 ToolStrip 溢位的項目。

ToolStripSplitButton

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

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

ToolStripItem 的一般功能

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

  • 核心事件

  • 影像處理

  • 對齊方式

  • 文字和影像的關聯性

  • 顯示樣式

核心事件

ToolStripItem 控制項會接收自己的點選、滑鼠和繪製事件,並且也可以執行某些鍵盤前置處理。

影像處理

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

影像縮放是由 ToolStripToolStripItem 中的屬性互動所決定,如下所示:

對齊方式

Alignment 屬性的值將決定 ToolStrip 的結尾,亦即項目顯示的地方。只有當 ToolStrip 的配置樣式設定為其中一個堆疊溢位 (Stack Overflow) 值時,Alignment 屬性才會有作用。

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

文字和影像的關聯性

TextImageRelation 屬性可定義影像的相對位置 (相對於 ToolStripItem 上的文字)。缺少影像、文字或兩者的項目會被視為特殊狀況,因此 ToolStripItem 不會針對缺少的項目顯示空白位置。

顯示樣式

DisplayStyle 可以讓您設定項目之 Text 和 Image 屬性的值,以便只顯示您想要的內容。這個功能通常只用於在不同內容中顯示同一個項目時,變更顯示樣式。

附屬類別

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

請參閱

概念

ToolStrip 技術摘要

參考

ToolStrip 控制項概觀 (Windows Form)

其他資源

ToolStrip 控制項 (Windows Form)

MenuStrip 控制項 (Windows Form)

StatusStrip 控制項

ContextMenuStrip 控制項

BindingNavigator 控制項 (Windows Form)