20章:チュートリアル19WPF - Windows フォーム用のコントロールを使う(VB)

    作成2013.03.17

  1. 参照元情報
     コントロール間の連携(Visual Basic ガイド ツアー)
    「WPF - Windows フォーム用のコントロールを使う」にジャンプする
     作成方法の詳細は上記を参照願います。


  2. コントロール間の連携
     WPF - Windows フォーム用のコントロールを使うの解説とおりに作業を実施すると、プロジェクトファイル群が完成します。
     完成ファイルは以下からダウンロードできます。
     ダウンロード後はダブルクリックで解凍してから使用してください。
      WPF - Windows フォーム用のコントロールを使う]をダウンロードする。
     解凍すると「20WFControls」フォルダーがあります。
    注(1)「20WFControls」フォルダーの「WFControls.sln」ファイルをダブルクリックすると「Microsoft Visual Basic 2010 Express」が起動します。
    注(2)メニューの「ウインド」_「ウインドレイアウトのリセット」で標準に戻ります。
    注(3)「ソリューションエクスプローラ」ウインドウ内の「MainWindow.xaml」をダブルクリックすると「デザイン」と「XAML」が表示されます。
    注(4)メニューの「表示」_「コード」を選択するとコードが表示されます。
    注(5)「WFControls.sln」の動作確認は「デバッグ」_「デバッグ開始」で実行します。デバッグ機能を用いて動作確認を行います。


  3. WFControlsの実行
    (1)「Microsoft Visual Basic 2010 Express」のデバッグ機能を使用します。
    (2)「デバッグ」_「デバッグ開始」を選択します。
    (3)MainWindow画面が表示されます。
    (4)IDのテキストに文字を入力すると3文字ごとに-がはいります。またラジオボタンも動作することがわかります。
    (5)クローズボックスで終了します。


  4. 新規プロジェクトの作成
    (1)新規プロジェクト
     新規プロジェクトを作成すると「デザイナー」にはとXAMLが自動生成されます。

    (2)XAMLコードの作成
     サンプルのXAMLコードをコピーして、ペーストすると完成します。

    (3) クラスコード
    Class MainWindow
    End Class
    が自動生成されます。

    (4) その他
     サンプルのXAMLコードをコピーして、ペーストすると簡単に完成しますが、内容の詳細が理解できません。できるだけデザイナーを使用して、XAMLコードを自動生成すると理解が深まります。
     ただし、デザイナーの操作だけでは、完全なコードが生成できないようです。最終的にはXAMLコードの仕組みを理解して、コードの修正が必要になるようです。
     学習のため、XAMLコードを少し変更してみました。


  5. XAMLの全コード
    <Window x:Class="SampleWFControls.MainWindow" 
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
            xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" 
            xmlns:self="clr-namespace:WFControls" 
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="100" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Label Grid.Column="0" Grid.Row="0" Content="ID:" />
            <WindowsFormsHost x:Name="wfHost" Grid.Column="1" Grid.Row="0" DataContext="{Binding}">
                <wf:MaskedTextBox x:Name="maskedText1" Text="20130315a"  Mask="aaa-aaa-aaa" />
            </WindowsFormsHost>
            <Label Grid.Column="0" Grid.Row="1" Content="Custom:" />
            <WindowsFormsHost x:Name="wfHost2" Grid.Column="1" Grid.Row="1">
                <self:UserControl1 x:Name="myControl" Choice="1" />
            </WindowsFormsHost>
        </Grid>
    </Window> 
    


  6. XAMLの階層構造
    <Window>階層1:クラス:
       <Grid>階層2:クラス:
            <Grid.ColumnDefinitions>階層3-1:プロパティ:
                <ColumnDefinition/>階層4-1:クラス:
                <ColumnDefinition/>階層4-1
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>階層3-2
                <RowDefinition/>階層4-2:クラス:
                <RowDefinition/>階層4-2
            </Grid.RowDefinitions>
            <Label/>
            <WindowsFormsHost>階層3-3:クラス:
                <wf:MaskedTextBox>階層4-3:クラス:
            </WindowsFormsHost>
            <Label/>
            <WindowsFormsHost>階層3-4:クラス:
                <self:UserControl1/>階層4-4:クラス:
            </WindowsFormsHost>
        </Grid>
    </Window>
    
    (1)XAMLを理解するには、まずXAMLの階層構造を理解する必要があります。(サンプルは上記のようになります。)
    (2)<Window>階層1:クラス:以下の記載が特別です。
     xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
     上記の記載はMaskedTextBoxクラスを使用するための記載です。MaskedTextBoxクラスは名前空間が System.Windows.Formsであり具体的にはsystem.windows.forms.dll 内にあると思われます。
    xmlns:self="clr-namespace:WFControls"
     上記の記載はWFControlsソリューションを使用するための記載です。WFControlsはプロジェクト名ですがなぜ?このような記載が必要なのか?難解です。
    (3)<Grid.ColumnDefinitions>階層3-1:プロパティ:この Grid のインスタンスで定義されている ColumnDefinitionCollection を取得します。
    (4) <ColumnDefinition/>階層4-1:クラス:Grid 要素に適用する列固有のプロパティを定義します。
    (5)<RowDefinition/>階層4-2:クラス:Grid 要素に適用する行固有のプロパティを定義します。
    (6) <WindowsFormsHost>階層3-3:クラス:Windows フォーム コントロールを WPF ページ上にホストできるようにする要素。
    (7) <wf:MaskedTextBox>階層4-3:クラス:適切なユーザー入力と不適切なユーザー入力を区別するには、マスクを使用します。
    (8)<self:UserControl1/>階層4-4:クラス:ユーザ定義のコントルール


    注(1)新たに作成したプロジェクトには、Windows フォーム コントロールを使うためのアセンブリは含まれていません。ソリューション エクスプローラーで、プロジェクト名を右クリックし、[参照の追加] メニューを呼び出します。「.NET」タブを選んで、 System.Windows.Forms を追加します。

    注(2)カスタム コントロールの追加:Windows フォーム用の簡単なカスタム コントロールを作成します。まず、ソリューション エクスプローラーで、SampleWFControls プロジェクトを右クリックし、[追加]−[新しい項目]で「Windows Forms」カテゴリーから「ユーザーコントロール」を選びます。ここでは、名前は「UserControl1」のデホルトです。


  7. UserControl1クラスの全コード
    Public Class UserControl1
        Public Sub UserControl1()
            InitializeComponent()
        End Sub
        Public Property Choice() As Integer
            Get
                If RadioButton1.Checked Then Choice = 1
                If RadioButton2.Checked Then Choice = 2
                If RadioButton3.Checked Then Choice = 3
                If RadioButton4.Checked Then Choice = 4
            End Get
            Set(ByVal value As Integer)
                RadioButton1.Checked = (value = 1)
                RadioButton2.Checked = (value = 2)
                RadioButton3.Checked = (value = 3)
                RadioButton4.Checked = (value = 4)
            End Set
        End Property
    End Class
    


  8. コードの解説
    (1)Public Sub UserControl1()は全く機能していないようです。削除しても動作に変化はありません。
    (2)Public Property Choice() As IntegerはChoiceプロパティを定義します。
    (3) GetはRadioButton.CheckedのON/OFFでChoiceの値を変化します。
    (4)Set(ByVal value As Integer)はChoiceの値でRadioButton.CheckedのON/OFFを変化します。



    感想:
    (1)WindowsフォームアプリケーションとWPFアプリケーションとでは、プログラミング手法が大きく変化しました。
    (2)このため、ツールボックスの互換性がなくなったようです。
    (3)このサンプルでは、WPFアプリケーションでWindowsフォームアプリケーションのツールボックスを使用する方法を示しています。
    (4)WPFアプリケーションがWindowsフォームアプリケーションの拡張であるために不可欠な機能と思います。
    (5)ソリューションエクスプローラの「My Project」をダブルクリックして、「参照」を選択すると参照名と「インポートされた名前空間」がわかります。System.Windows.Formsはチェックがはずれていますが、チェックをいれても何も変化しません。
    (6)xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" と
    xmlns:self="clr-namespace:WFControls"の記載は不可欠のようです。







21章:チュートリアル20:WPF - コントロールを動的に作成する(VB)に行く。

トップページに戻る。