ごみばこ

プログラムに関する備忘録などを書いています。

Dockプロパティを作ってみた

前回の続き。

まずはコントロールを作るところから。
テキストを足しただけです。後少し大きくなってます。
以下が画像とソース。
f:id:choco_0214:20161120111029p:plain

Imports System.Windows.Forms
Imports System.Text

''' <summary>
''' ボタンテキストとToolTipを追加したDockEditor UIです。
''' </summary>
Public Class MyDockEditorUI

    ''' <summary>
    ''' ToolTip用のテキスト。
    ''' </summary>
    Private _strTip As New StringBuilder

    Private _dockStyle As DockStyle
    ''' <summary>
    ''' DockStyleの値を取得または設定します。
    ''' </summary>
    Public Property [DockStyle]() As DockStyle
        Get
            Return _dockStyle
        End Get
        Set(ByVal value As DockStyle)
            _dockStyle = value
        End Set
    End Property

    Private _buttonInfo As New Dictionary(Of Button, DockStyle)
    ''' <summary>
    ''' ButtonコントロールとDockStyleのコレクションを取得します。
    ''' </summary>
    Public ReadOnly Property ButtonInfo() As Dictionary(Of Button, DockStyle)
        Get
            Return _buttonInfo
        End Get
    End Property

    Public Sub New()

        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()
       
        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        For Each item As Control In Me.Controls
            Me.SetButtonSettings(item)
        Next

    End Sub

    ''' <summary>
    ''' ボタンクリック時のイベント。
    ''' </summary>
    Private Sub ButtonClick(ByVal sender As Object, ByVal e As EventArgs)

        Dim clickedButton As Button = DirectCast(sender, Button)

        Me._dockStyle = DirectCast(CInt(clickedButton.Tag), DockStyle)

    End Sub

    ''' <summary>
    ''' 各Buttonコントロールにイベントを設定します。
    ''' </summary>
    Private Sub SetButtonSettings(ByVal control As Control)

        If Me.CheckIfButton(control) Then
            Me._buttonInfo.Add(control, control.Tag)
            Me.SetToolTipToButton(control)
            AddHandler control.Click, AddressOf Me.ButtonClick
        End If

    End Sub

    ''' <summary>
    ''' 渡されたControlがButtonコントロールか判別します。
    ''' </summary>
    Private Function CheckIfButton(ByVal control As Control) As Boolean

        If TypeOf control Is Button Then Return True

        Return False

    End Function

    ''' <summary>
    ''' 各Buttonコントロールにツールチップを設定します。
    ''' </summary>
    Private Sub SetToolTipToButton(ByVal control As Control)

        Me._strTip.Length = 0

        If DirectCast(CInt(control.Tag), DockStyle) <> DockStyle.None Then
            With Me._strTip
                .Append("This control docking ")
                .Append(control.Text)
                .Append(".")
            End With

        Else
            Me._strTip.Append("This control isn't docking.")

        End If

        Me.tipButtonText.SetToolTip(control, Me._strTip.ToString())

    End Sub

End Class

プロパティのドロップダウンは一度生成する処理が入っているので、
コンストラクタで必要な情報と処理をDictionaryに渡しています。

あまりスマートな書き方じゃないかもしれませんが、
100行程度に収まってるのでよしとしてます。。

次回はUITypeEditor側の内容を書こうと思います。