作成2013.03.17
- 参照元情報
コントロール間の連携(Visual Basic ガイド ツアー)
「WPF - Windows フォーム用のコントロールを使う」にジャンプする
作成方法の詳細は上記を参照願います。
- コントロール間の連携
WPF - Windows フォーム用のコントロールを使うの解説とおりに作業を実施すると、プロジェクトファイル群が完成します。
完成ファイルは以下からダウンロードできます。
ダウンロード後はダブルクリックで解凍してから使用してください。
WPF - Windows フォーム用のコントロールを使う]をダウンロードする。
解凍すると「20WFControls」フォルダーがあります。
注(1)「20WFControls」フォルダーの「WFControls.sln」ファイルをダブルクリックすると「Microsoft Visual Basic 2010 Express」が起動します。
注(2)メニューの「ウインド」_「ウインドレイアウトのリセット」で標準に戻ります。
注(3)「ソリューションエクスプローラ」ウインドウ内の「MainWindow.xaml」をダブルクリックすると「デザイン」と「XAML」が表示されます。
注(4)メニューの「表示」_「コード」を選択するとコードが表示されます。
注(5)「WFControls.sln」の動作確認は「デバッグ」_「デバッグ開始」で実行します。デバッグ機能を用いて動作確認を行います。
- WFControlsの実行
(1)「Microsoft Visual Basic 2010 Express」のデバッグ機能を使用します。
(2)「デバッグ」_「デバッグ開始」を選択します。
(3)MainWindow画面が表示されます。
(4)IDのテキストに文字を入力すると3文字ごとに-がはいります。またラジオボタンも動作することがわかります。
(5)クローズボックスで終了します。
- 新規プロジェクトの作成
(1)新規プロジェクト
新規プロジェクトを作成すると「デザイナー」にはとXAMLが自動生成されます。
(2)XAMLコードの作成
サンプルのXAMLコードをコピーして、ペーストすると完成します。
(3) クラスコード
Class MainWindow
End Class
が自動生成されます。
(4) その他
サンプルのXAMLコードをコピーして、ペーストすると簡単に完成しますが、内容の詳細が理解できません。できるだけデザイナーを使用して、XAMLコードを自動生成すると理解が深まります。
ただし、デザイナーの操作だけでは、完全なコードが生成できないようです。最終的にはXAMLコードの仕組みを理解して、コードの修正が必要になるようです。
学習のため、XAMLコードを少し変更してみました。
- 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>
- 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」のデホルトです。
- 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
- コードの解説
(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"の記載は不可欠のようです。