VB のたまご

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


フォームデザイナ


DesignSurface

  •  それでは以下サンプルです。
  • Imports System.ComponentModel.Design ' System.Design.dll を参照追加
    
    Public Class frmDesignSurface
    
        Public Sub New()
    
            ' この呼び出しはデザイナーで必要です。
            InitializeComponent()
    
            ' InitializeComponent() 呼び出しの後で初期化を追加します。
    
    
    
            ' コンストラクタ内、Load, Shown イベント、どのタイミングでも良い気がします。
    
            ' 画面デザインに関する窓口的なクラスを宣言
            ' この時、ルートデザイナー(ベースとなるコントロール)を Form として登録する
            Dim _DesignSurface = New DesignSurface(GetType(Form))
    
            ' UserControl 等にもできる
            'Dim _DesignSurface = New DesignSurface(GetType(UserControl))
    
            ' ルートデザイナー(ここでは Form)のビュー(下地、コンテナコントロールみたいなもの)を取得
            Dim designView = CType(_DesignSurface.View, Control)
            designView.Dock = DockStyle.Fill
            Me.Controls.Add(designView)
    
        End Sub
    
    
    End Class
    

    イメージ
  •  すごい大変そうかと思いきや、これだけでベース部分ができてしまいます。簡単ですね。

  •  デザイン時アーキテクチャで中心的な役割を担っているのが DesignSurface クラスになります。主人公ポジションです。 昔(net1.1の頃)は BehaviorService が中心になってあれこれ面倒見ていたみたいですが、net2.0 以降は DesignSurface がその座を交代したみたいです。 さらには DesignSurfaceManager もあるのですが、理解していないので省きます。

  •  DesignSurface のインスタンス生成時に、ベースとなるコントロールを指定することで、それが下地になって表示されます。 デザイン時アーキテクチャでは、コンポーネントがなんちゃら~という説明がたくさん出てきますが、要するにコントロールのことです。Form や Button, Timer などのことです。

  •  ここで指定したコントロール(サンプルだと Form)をルートデザイナーと呼びますが、ルートデザイナーを動作させるため?に、その下地となるビューを画面クラスに追加する必要があります。


IDesignerHost

  •  ところで、デザイン画面にタイトルが表示されていません。デザイン画面にタイトルをセットするには、IDesignerHost サービスを利用します。
  • Imports System.ComponentModel.Design ' System.Design.dll を参照追加
    
    Public Class frmIDesignerHost
    
        Public Sub New()
    
            ' この呼び出しはデザイナーで必要です。
            InitializeComponent()
    
            ' InitializeComponent() 呼び出しの後で初期化を追加します。
    
    
    
            ' コンストラクタ内、Load, Shown イベント、どのタイミングでも良い気がします。
    
            ' 画面デザインに関する窓口的なクラスを宣言
            Dim _DesignSurface = New DesignSurface(GetType(Form))
    
    
    
            '  ★ IDesignerHost
            ' デザイン画面にアクセスするためのサービス機能
            Dim designerHost = CType(_DesignSurface.GetService(GetType(IDesignerHost)), IDesignerHost)
            Dim designForm = CType(designerHost.RootComponent, Form)
            designForm.Text = "画面デザイナー"
            designForm.BackColor = Color.AliceBlue
            designForm.FormBorderStyle = FormBorderStyle.FixedToolWindow
    
            ' 選択時の装飾が、デフォルト(300, 300)のまま残って、うまく連動してくれないのだが、対応が分からない。
            'designForm.Size = New Size(320, 240)
    
    
    
            ' ルートデザイナー(ここでは Form)のビュー(下地、コンテナコントロールみたいなもの)を取得
            Dim designView = CType(_DesignSurface.View, Control)
            designView.Dock = DockStyle.Fill
            Me.Controls.Add(designView)
    
        End Sub
    
    End Class
    

    イメージ
  •  このように、何かの機能を追加したい場合、GetService() から対応するインターフェース、またはクラスを取得して操作していきます。 このことは、デフォルトで、DesignSurface 内にいくつかのインターフェース(を実装したクラスのインスタンス)がすでに登録済みであるということです。

  •  デザイン時アーキテクチャでは、サービスとは何らかの機能1つ分を意味していて、インターフェース経由で操作していきます。 WPF の MVVM ライブラリである Prism の Unity コンテナ(DI)機構に似ています。

  •  もちろん、未登録な機能もあります。この場合は、AddService() でインターフェースと実装クラスのインスタンスを関連付けながら登録して、機能を追加していきます。 DesignSurface には AddService() が無いので、後半では、各サービスを管理する IServiceContainer に、この役目を受け持ってもらいます。