自訂ToolStrip的ToolStripItem

一般我們使用ToolStrip大概都還是用.NET提供的基本下拉式選單,有一次在MSDN 論壇上有人發問是否可以做出自訂的樣式,這一篇文就來介紹如何自訂ToolStrip的ToolStripItem。

        一般我們使用ToolStrip大概都還是用.NET提供的基本下拉式選單,有一次在MSDN 論壇上有人發問是否可以做出自訂的樣式,這一篇文就來介紹如何自訂ToolStrip的ToolStripItem。

一般的

自訂的

Tool1 Tool2

 

 

       要做出上方右邊圖所顯示的自訂ToolStripItem,該類別就必須要繼承自 ToolStripControlHost 類別 以便裝載使用者控制項。在實做這個功能的時候有兩個需要特別瞭解的地方。

       1. 建構函式

            在自訂類別中繼承ToolStripControlHost類別時必須要實做建構函式把控制項傳遞至類別中,它的建構函式有兩個多載:

ToolStripControlHost 建構函式 (Control) 初始化 ToolStripControlHost 類別的新執行個體,而這個類別會裝載指定的控制項。
ToolStripControlHost 建構函式 (Control, String) 初始化 ToolStripControlHost 類別的新執行個體,而這個類別會裝載指定的控制項且具有指定的名稱。

          這兩個多載的差別其實只有在建立執行個體時會不會同時設定該執行個體的 Name 屬性而已,沒有什麼太大的差異。

       2. Control屬性

          Control屬性的主要目的是為了取得ToolStripControlHost類別執行個體所裝載的控制項所使用,基本上是一定會應用到的屬性。

     接下來就進入實做的過程:

   

1. 先建立一個 Windows 應用程式的專案,在方案總管中選擇建立使用者控制項 Tool3
2. 在畫面中做簡單的設計,建立兩個Label 、兩個DateTimePicker 和一個Button Tool4
3.在方案總管中選擇建立類別 Tool5

4.在類別程式碼中繼承ToolStripControlHost類別並建立以下程式碼:

Public Class CSCalendarMenu
    Inherits ToolStripControlHost
    Sub New()
        MyBase.New(New UserControl1)
    End Sub
    Public ReadOnly Property _Time1() As Date
        Get
            Return CType(Control, UserControl1).DateTimePicker1.Value
        End Get
    End Property
    Public ReadOnly Property _Time2() As Date
        Get
            Return CType(Control, UserControl1).DateTimePicker2.Value
        End Get
    End Property
End Class

       藍色字標明的部份是重點,除了繼承ToolStripControlHost類別外,同時要實做建構函式將剛剛在步驟2所建立的使用者控制項(UserControl1)裝載至這個類別。到這邊為止,就完成了自訂ToolStripItem的設定,接下來是在Form中使用這個自訂的ToolStripItem。MyBase.New意指呼叫此類別的父系類別(也就是ToolStripControlHost)的建構函式。

       首先在Form上加入一個ToolStrip,然後在上面新增一個DropDwonButton,在Form的內容中放兩個TextBox,這是為了顯示取得自訂ToolStripItem中兩個DateTimePicker的Value屬性值,然後寫入以下的程式碼:

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim ObjCSCalendarMenu As New CSCalendarMenu
        ToolStripDropDownButton2.DropDownItems.Add(ObjCSCalendarMenu)
        AddHandler CType(ObjCSCalendarMenu.Control, UserControl1).Button1.Click, AddressOf OnObjCSCalendarMenu_Click
    End Sub
    Private Sub OnObjCSCalendarMenu_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        TextBox1.Text = CType(ToolStripDropDownButton2.DropDownItems(0), CSCalendarMenu)._Time1
        TextBox2.Text = CType(ToolStripDropDownButton2.DropDownItems(0), CSCalendarMenu)._Time2
    End Sub

End Class

      以下就重點說明

Dim ObjCSCalendarMenu As New CSCalendarMenu :產生一個CSCalendarMenu的執行個體。

ToolStripDropDownButton2.DropDownItems.Add(ObjCSCalendarMenu) :將執行個體加入到ToolStripDropDownButton2.DropDownItems集合中。

AddHandler CType(ObjCSCalendarMenu.Control, UserControl1).Button1.Click, AddressOf OnObjCSCalendarMenu_Click :委派自訂ToolStripItme中Button1的Click事件處理涵式。

執行的畫面如下:

Tool6

這樣就完成了一個自訂的工具列選項,此程式的範例可在以下連結下載:UserDropDownItem0.zip