作成2013.04.17
10 行でズバリ!! [C#] WPF - Windows フォーム用のコントロールを使うは下記の参照元情報からほぼ完全な作成方法の説明と解説を参照できます。
- 参照元情報
10 行でズバリ!! [C#] WPF - Windows フォーム用のコントロールを使うは
「10 行でズバリ!! [C#] WPF - Windows フォーム用のコントロールを使う」にジャンプする
作成方法の詳細は上記を参照願います。
- 10 行でズバリ!! [C#] WPF - Windows フォーム用のコントロールを使うの完成ファイル
10 行でズバリ!! [C#] WPF - Windows フォーム用のコントロールを使うの作成の解説とおりに作業を実施すると、C#プロジェクトファイル群が完成しますが、 ここでは、VBで作成したプログラムをC#言語に変換を基本とします。
完成ファイルは以下からダウンロードできます。
ダウンロード後は解凍してから使用してください。
[10 行でズバリ!! [C#] WPF - Windows フォーム用のコントロールを使う]をダウンロードする。
解凍すると「22WFControls」フォルダーがあります。
注(1)「22WFControls」フォルダーの「WFControls.sln」ファイルをダブルクリックすると「Express 2012 for Windows Desktop」が起動します。
注(2)メニューの「ウインド」_「ウインドレイアウトのリセット」で標準に戻ります。
注(3)「ソリューションエクスプローラ」ウインドウ内の「MainWindow.xaml」をダブルクリックすると「デザイン」が表示されます。
注(4)メニューの「表示」_「コード」を選択するとコードが表示されます。
注(5)「WFControls.sln」の動作確認は「デバッグ」_「デバッグ開始」で実行します。デバッグ機能を用いて動作確認を行います。
- WFControls.slnの実行
(1)「Express 2012 for Windows Desktop」のデバッグ機能を使用します。
(2)「デバッグ」_「デバッグ開始」を選択します。
(3)操作画面が表示されます。
(4)IDのテキストに文字を入力すると3文字ごとに-がはいります。またラジオボタンも動作することがわかります。
(5)クローズボックスで終了します。
- 新規プロジェクトの作成
(1)MainWindow.xamlのデザイン設定
新規プロジェクトを作成すると「デザイナー」にはMainWindow.xamlが自動生成されます。MainWindow.xamlのデザイン設定はVBのMainWindow.xamlのコピー&ペーストで完成します。
(2) MainWindow.xaml.csコード
基本コードが自動生成されます。
- MainWindow.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>
- MainWindow.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」のデホルトです。
- MainWindow.xaml.csの全コード
MainWindow.xaml.csコードはありません。
- MainWindow.xaml.csコードの解説
MainWindow.xaml.csコードはありません。
- UserControl1csの全コードの全コード
using System.Windows.Forms;
namespace WFControls
{
public partial class UserControl1 : UserControl
{
public int Choice
{
get
{
if (RadioButton1.Checked) { return 1; }
if (RadioButton2.Checked) { return 2; }
if (RadioButton3.Checked) { return 3; }
if (RadioButton4.Checked) { return 4; } else { return 0; }
}
set
{
RadioButton1.Checked = (value == 1);
RadioButton2.Checked = (value == 2);
RadioButton3.Checked = (value == 3);
RadioButton4.Checked = (value == 4);
}
}
public UserControl1()
{
InitializeComponent();
}
}
- UserControl1csコードの解説
(1)public int Choiceはint型のプロパティを定義します。
(2)RadioButton1がクリックされていると1を返し、2では2、3では3、4では4、その他は0を返します。
(3)value=1のとき、RadioButton1.Checked=Trueを設定し、その他をfalsに設定します。
感想:
(1)VBからC#への変更は比較的簡単です。