VB のたまご

作成日: 2018/11/07, 更新日: 2018/11/07


デザイン時サービス(2)


INameCreationService

  •  前回、デフォルトデータが未登録でコントロールが配置されてしまいました。INameCreationService サービスは、デフォルト名(データ)を管理してくれるサービスです。 例えば、VB.NET だとコントロール名は「コントロールの型名」+「連番(1始まり)」となっています。C# だとコントロール名は、VB.NET の場合に加えて、先頭文字が小文字になります。

  •  これらの命名規則は処理として作成されています。以下サンプルです。
  • Imports System.ComponentModel
    Imports System.ComponentModel.Design.Serialization
    
    Public Class NameCreationService
        Implements INameCreationService
    
        ' 指定されたコンテナーのすべてのコンポーネントに一意の新しい名前を作成します。
        ' 型名をベースに、連番(1始まり)
        Public Function CreateName(container As IContainer, dataType As Type) As String Implements INameCreationService.CreateName
    
            Dim i = 0
            Dim name = dataType.Name
    
            While True
                i += 1
                If container.Components($"{name}{i}") Is Nothing Then
                    Exit While
                End If
            End While
    
            Return $"{name}{i}"
    
        End Function
    
        ' 指定した名前が有効かどうかを示す値を取得します。
        Public Sub ValidateName(name As String) Implements INameCreationService.ValidateName
    
            If Not IsValidName(name) Then
                Throw New ArgumentException($"{name} は不正です。")
            End If
    
        End Sub
    
        ' 指定した名前が有効かどうかを示す値を取得します。
        ' 名前があること、1文字目はアンダーバーじゃないこと、などなど
        Public Function IsValidName(name As String) As Boolean Implements INameCreationService.IsValidName
    
            If String.IsNullOrEmpty(name) Then
                Return False
            End If
    
            If Char.IsDigit(name, 0) OrElse name(0) = "_" Then
                Return False
            End If
    
            Return True
    
        End Function
    
    End Class
    

  •  そのままですね。

  •  使う側も以下の通りです。INameCreationService サービスは、登録することで使えるようになるサービスです。
  • ' INameCreationService
    ' 配置したコントロールのデフォルト名を付ける役割
    serviceContainer.AddService(GetType(INameCreationService), New NameCreationService)
    

    イメージ
  •  これで、それっぽく見えるようになってきました!


ISelectionService

  •  コントロールを配置したら、今度はプロパティウィンドウが見たくなります。ただ、PropertyGrid を貼り付けただけで表示されるわけがなく、 やはり専用サービスを利用します。以下サンプルです。
  • ' ISelectionService
    ' 配置コントロールの選択系イベント管理の役割
    ' 選択したコントロール情報を、プロパティウィンドウに表示更新する
    Dim selectionService = CType(serviceContainer.GetService(GetType(ISelectionService)), ISelectionService)
    AddHandler selectionService.SelectionChanged, AddressOf Me.SelectionService_SelectionChanged
    
    
    ' 選択したコントロールは、PropertyGrid にセットして詳細データを表示する
    Private Sub SelectionService_SelectionChanged(sender As Object, e As EventArgs)
    
        Dim selectionService = CType(_DesignSurface.GetService(GetType(ISelectionService)), ISelectionService)
        If selectionService.SelectionCount = 0 Then
            PropertyGrid1.SelectedObject = Nothing
        Else
            Dim items(selectionService.SelectionCount - 1) As Object
            selectionService.GetSelectedComponents().CopyTo(items, 0)
            PropertyGrid1.SelectedObjects = items
        End If
    
    End Sub
    

  •  ISelectionService サービスは、SelectionChanged イベントを公開しています。このイベントは、選択中のコントロールが切り替わったタイミングで発行されるイベントになります。 これを利用して、新しく選択されたコントロールを PropertyGrid にセットする処理を組み込んでいきます。 実行するとこんな感じです。

  • イメージ
  •  それっぽく見えるようになりましたよね?