19章:チュートリアル18:コントロール間の連携 (VB)

    作成2013.03.16

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


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


  3. MyListboxの実行
    (1)「Microsoft Visual Basic 2010 Express」のデバッグ機能を使用します。
    (2)「デバッグ」_「デバッグ開始」を選択します。
    (3)MainWindow画面が表示されます。
    (4)comboBoxをクリックすると文字の色を変えることができます。
    (5)クローズボックスで終了します。


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

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

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

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


  5. XAMLの全コード
    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        xmlns:mscorlib="clr-namespace:System.Reflection;assembly=mscorlib" >
    
        <Window.Resources>
            <!-- PropertyInfo オブジェクトに適用するデータ テンプレート -->
            <DataTemplate DataType="{x:Type mscorlib:PropertyInfo}">
                <StackPanel Orientation="Horizontal" Margin="3">
                    <Border BorderBrush="Black" BorderThickness="2"
                            CornerRadius="5" Width="20" Height="20"
                            Background="{Binding Path=Name}" />
                    <TextBlock Margin="5,0,5,0" Text="{Binding Path=Name}"/>
                </StackPanel>
            </DataTemplate>
        </Window.Resources>
    
        <StackPanel Background="LightPink">
            <TextBox Name="textBox1" Margin="5" Text="TEST"/>
            <Slider Name="slider1" Margin="5" Minimum="10" Maximum="50" Value="30"/>
    
            <ComboBox Name="comboBox1" Margin="5" Width="150" 
                     MaxDropDownHeight="300"
                      Loaded="comboBox1_Loaded" />
    
            <TextBlock Name="textBlock1" Margin="5" TextWrapping="Wrap"
                       Text="{Binding ElementName=textBox1, Path=Text}"
                       FontSize="{Binding ElementName=slider1, Path=Value}"
                       Foreground="{Binding ElementName=comboBox1, Path=SelectedValue.Name}" />
        </StackPanel>
    </Window>
            </Ellipse>
        </Canvas>
    </Window>
    


  6. XAMLの階層構造
    <Window>階層1:クラス:
        <Window.Resources>階層2-1:プロパティ:
            <DataTemplate>階層3-1:クラス:
                <StackPanel>階層4-1:クラス:
                    <Border/>階層5-1:クラス:
                    <TextBlock />階層5-1:クラス:
                </StackPanel>
            </DataTemplate>
        </Window.Resources>
    
        <StackPanel>階層2-2:クラス:
            <TextBox/>階層3-2:クラス:
            <Slider/>階層3-2:クラス:
            <ComboBox/>階層3-2:クラス:
            <TextBlock/>階層3-2:クラス:
        </StackPanel>
    </Window>
    
    (1)XAMLを理解するには、まずXAMLの階層構造を理解する必要があります。(サンプルは上記のようになります。)
    (2)<Window>階層1:クラス:以下の記載が特別です。
     xmlns:mscorlib="clr-namespace:System.Reflection;assembly=mscorlib"
     上記の記載はPropertyInfoクラスを使用するための記載です。PropertyInfoクラスは名前空間が System.Reflectionであり具体的にはmscorlib.dll内にあると思われます。(標準設定では、参照できないようです。)
    (3)<Window.Resources>階層2-1:プロパティ:ローカルで定義されたリソース ディクショナリを取得または設定します。
    (4)<DataTemplate>階層3-1:クラス:データ オブジェクトのビジュアル構造を記述します。
    (5)<Border/>階層5-1:クラス:別のオブジェクトの周囲に境界線、背景、またはその両方を描画します。
    (6)<TextBlock />階層5-1:クラス:少量のフロー コンテンツを表示する軽量コントロールを提供します。
    (7) <StackPanel>階層2-2:クラス:StackPanel

    注:イベント ハンドラーの本体を Visual Basic のコードで記述します。このため、XAML エディター上で、上記の Loaded="comboBox1_Loaded" の部分をマウスで右クリックし、コンテキスト メニューから [イベント ハンドラーへ移動] をクリックします。これにより、comboBox1_Loaded メソッドが自動的に作成され Visual Basic のコード エディターが開きます。


  7. VBの全コード
     Imports System.Reflection
    Class MainWindow
        Private Sub comboBox1_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs)
            ' PropertyInfo オブジェクトの配列をデータ バインディング
            Dim colorProps As PropertyInfo() = GetType(Colors).GetProperties()
            Me.ComboBox1.ItemsSource = colorProps
            ' 最初は先頭の項目が選択されている状態にする
            Me.ComboBox1.SelectedIndex = 0
        End Sub
    End Class
    


  8. コードの解説
    (1)Imports System.Reflection:PropertyInfo() は名前空間が System.Reflectionのmscorlib.dll内にあり、これを使用するため、先頭に記載する必要がありそうです。
    (2)Private Sub comboBox1_LoadedはcomboBox1をロードするとき呼び出されます。
    (3) Dim colorProps As PropertyInfo() = GetType(Colors).GetProperties()は変数colorPropsをPropertyInfo() 型で生成します。
    (4)Me.ComboBox1.ItemsSource = colorPropsはMe.ComboBox1.ItemsSourceに変数colorPropsの値を代入します。
    (5)Me.ComboBox1.SelectedIndex = 0は先頭項目を選択します。


    感想:
    (1)ソリューションエクスプローラの「My Project」をダブルクリックして、「参照」を選択すると参照名と「インポートされた名前空間」がわかります。
    (2)参照名とDLLファイルは1対1の対応しているようです。
    (3)「インポートされた名前空間」はチェックのある項目と無い項目があります。
    (4)「インポートされた名前空間」のSystem.ReflectionにチェックをいれるとImports System.Reflectionの記載を削除しても正常に動作します。
    (5)しかし、「xmlns:mscorlib="clr-namespace:System.Reflection;assembly=mscorlib"」の記載を削除するとエラーとなります。なぜでしょう?
    (6)DLLはC:\Program Files (x86)\Microsoft Silverlight\5.1.20125.0\mscorlib.dllにありました。PropertyInfoはSilverlightの機能の一部かもしれません。
    (7)Visual Basic 2010 Expressは学習用でサンプルコードが全て動作はしないようです。Silverlightはサポートしていないようですが、Importsによりその機能の一部が使用できるのかもしれません。







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

トップページに戻る。