• 検索結果がありません。

グラフィックス 目次

N/A
N/A
Protected

Academic year: 2021

シェア "グラフィックス 目次"

Copied!
26
0
0

読み込み中.... (全文を見る)

全文

(1)

■ Windows フォームでの WPF 複合コントロールのホスト ■

Windows Presentation Foundation(WPF)は、アプリケーションの作成に適した環境を提供する。但 し、Windows フォームのコードに多大な手間と時間を懸けた場合は、コードを最初から記述し直すよ りも、既存のWindows フォームアプリケーションを WPF で拡張する方が効率的と成る事も有る。一 般的なシナリオとしては、Windows フォームアプリケーション内に、WPF を使用して実装したコント ロールを埋め込む場合が挙げられる。WPF コントロールのカスタマイズ方法の詳細に付いては、「コン トロールのカスタマイズ」を参照され度い。 此のチュートリアルでは、Windows フォームアプリケーションで WPF 複合コントロールをホストして データエントリを実行するアプリケーションに付いて段階的に説明する。複合コントロールは DLL に パッケージ化されて居る。此の一般的な手順は、更に複雑なアプリケーションやコントロールに拡張出 来る。此のチュートリアルは、外観や機能が「チュートリアル: WPF での Windows フォーム複合コン トロールのホスト」の例と粗同じに成る様に設計されて居る。主な違いは、ホストする側とされる側が 逆で有る事で有る。 チュートリアルは、2 つのセクションに分かれて居る。最初のセクションでは、WPF 複合コントロール の実装に付いて簡単に説明する。2 番目のセクションでは、Windows フォームアプリケーションで複合 コントロールをホストし、コントロールからイベントを受け取って、コントロールのプロパティの一部 にアクセスする方法に付いて詳しく説明する。 此のチュートリアルでは、以下のタスクを行う。 ・WPF 複合コントロールを実装する。 ・Windows フォームホストアプリケーションを実装する。 ■ WPF 複合コントロールの実装 此の例で使用される WPF 複合コントロールは、ユーザーの名前と住所を受け取る単純なデータ入力フ ォームで有る。ユーザーが2 つのボタンの孰れかをクリックして入力操作が終了した事を示すと、コン トロールは入力情報をホストに返すカスタムイベントを発生させる。レンダリングされたコントロール を次の図に示す。

W

WP

PF

F

チュ

ュー

ート

トリ

リア

アル

(2)

プロジェクトの作成

1.Microsoft Visual Studio を起動して、[新しいプロジェクト] ダイアログボックスを開く。

2.Visual Basic 又は Visual C#の Windows のカテゴリで、[WPF ユーザーコントロールライブラリ] テ ンプレートを選択する。 ※ Express バージョンでは、上記のテンプレートは存在しないので、先ず、クラスライブラリ(又 は Windows フォームアプリケーション)を選択し、ユーザーコントロール(WPF)を追加し て、クラスライブラリ(又はWindows フォーム)を削除する。 3.新しいプロジェクトにMyControls と謂う名前を付ける。 4.配置場所としては、WindowsFormsHostingWpfControl 等、解り易い名前を付けた最上位フォル ダーを指定する。此のフォルダーには後でホストアプリケーションも配置する。 5.[OK] をクリックして、プロジェクトを作成する。既定のプロジェクトには、UserControl1 と謂う 名前の1 つのコントロールが含まれる。 6.ソリューションエクスプローラーで、UserControl1 の名前を MyControl1 に変更する。 プロジェクトは、次のシステムDLL を参照して居る必要が有る。此等の DLL の孰れかが既定で含まれ て居ない場合は、プロジェクトに追加する。 ・PresentationCore ・PresentationFramework ・System ・WindowsBase ユーザーインターフェイスの作成

複合コントロールのユーザーインターフェイス(UI)は、Extensible Application Markup Language (XAML)を使用して実装される。複合コントロールの UI は 5 つの TextBox 要素で構成されて居る。 各TextBox 要素には、ラベルとして使用される TextBlock 要素が関連付けられて居る。下部には [OK] 及び [Cancel] と謂う 2 つの Button 要素が有る。ユーザーが孰れかのボタンをクリックすると、コン トロールは情報をホストに返すカスタムイベントを発生させる。

基本的なレイアウト

Grid 要素には、様々な UI 要素が格納される。Grid を使用して、HTML で Table 要素を使用する場合 と殆ど同じ方法で、複合コントロールのコンテンツを配置出来る。WPF には Table 要素も有るが、Grid の方が軽量で、単純なレイアウトタスクに適して居る。

次のXAML に基本的なレイアウトを示す。此の XAML では、Grid 要素に列と行の数を指定する事に

依り、コントロールの全体的な構造を定義して居る。

(3)

XAML <Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="MyControls.MyControl1" Background="#DCDCDC" Width="375" Height="250" Name="rootElement" Loaded="Init"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> ... </Grid> UI 要素のスタイル設定 データ入力フォームの多くの要素は、外観が似て居る。詰まり、其等の要素では幾つかのプロパティの 設定が同一に成る。前のXAML では、各要素の属性を個別に設定するのではなく、Style 要素を使用し て、複数の要素のクラスの標準プロパティ設定を定義して居る。此の方法では、コントロールの複雑さ が軽減され、1 つのスタイル属性を使用して複数の要素の外観を変更出来る。

Style 要素は Grid 要素の Resources プロパティに格納される為、コントロール内の総ての要素で使用出

来る。スタイルに名前が付いて居る場合は、其のスタイルの名前に設定されたStyle 要素を追加する事

に依って、要素に其のスタイルを適用する。名前が付いて居ないスタイルは、要素の既定のスタイルに

成る。WPF のスタイルの詳細に付いては、「スタイルとテンプレート」を参照され度い。

複合コントロールの Style 要素を次の XAML に示す。スタイルが要素に何の様に適用されるかに付い

ては、前のXAML を参照され度い。例えば、最後の TextBlock 要素には inlineText スタイルが適用さ れ、最後のTextBox 要素は既定のスタイルを使用する。

(4)

XAML

<Grid.Resources>

<Style x:Key="inlineText" TargetType="{x:Type TextBlock}"> <Setter Property="Margin" Value="10,5,10,0"/>

<Setter Property="FontWeight" Value="Normal"/> <Setter Property="FontSize" Value="12"/>

</Style>

<Style x:Key="titleText" TargetType="{x:Type TextBlock}"> <Setter Property="DockPanel.Dock" Value="Top"/>

<Setter Property="FontWeight" Value="Bold"/> <Setter Property="FontSize" Value="14"/> <Setter Property="Margin" Value="10,5,10,0"/> </Style>

<Style TargetType="{x:Type Button}">

<Setter Property="Margin" Value="10,5,10,0"/> <Setter Property="Width" Value="60"/>

</Style>

<Style TargetType="{x:Type TextBox}">

<Setter Property="Margin" Value="10,5,10,0"/> </Style> </Grid.Resources> TextBlock 要素と TextBox 要素のグリッドへの追加 グリッドに UI 要素を配置するには、其の要素の Row プロパティと Column プロパティに適切な行番 号と列番号を設定する。行と列の番号付けは0 から始まる点に注意する。ColumnSpan プロパティを設 定する事に依って、1 つの要素を複数の列に跨がって表示する事が出来る。Grid 要素の詳細に付いては、 「方法 : グリッド要素を作成する」を参照され度い。

次のXAML では、複合コントロールの TextBox 要素と TextBlock 要素に、要素をグリッドに適切に配 置する為のRow プロパティと Column プロパティを設定して居る。

MyControl1.xaml で、次の XAML を Grid 要素内に追加する。

XAML <TextBlock Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="4" Margin="10,5,10,0" HorizontalAlignment="Center"

Style="{StaticResource titleText}">Simple WPF Control</TextBlock> <TextBlock Grid.Column="0" Grid.Row="1" Style="{StaticResource inlineText}" Name="nameLabel">Name</TextBlock> <TextBox Grid.Column="1" Grid.Row="1"

(5)

Grid.ColumnSpan="3" Name="txtName"/> <TextBlock Grid.Column="0" Grid.Row="2" Style="{StaticResource inlineText}" Name="addressLabel">Street Address</TextBlock> <TextBox Grid.Column="1" Grid.Row="2" Grid.ColumnSpan="3" Name="txtAddress"/> <TextBlock Grid.Column="0" Grid.Row="3" Style="{StaticResource inlineText}" Name="cityLabel">City</TextBlock> <TextBox Grid.Column="1" Grid.Row="3" Width="100" Name="txtCity"/> <TextBlock Grid.Column="2" Grid.Row="3" Style="{StaticResource inlineText}" Name="stateLabel">State</TextBlock> <TextBox Grid.Column="3" Grid.Row="3" Width="50" Name="txtState"/> <TextBlock Grid.Column="0" Grid.Row="4" Style="{StaticResource inlineText}" Name="zipLabel">Zip</TextBlock> <TextBox Grid.Column="1" Grid.Row="4" Width="100" Name="txtZip"/> [OK] 及び [Cancel] ボタンの追加 複合コントロール上の最後の要素は、Grid の最後の行の最初の 2 つの列を専有する [OK] 及び [Cancel] の Button 要素で有る。此等の要素は、共通のイベントハンドラーで有る ButtonClicked、及 び、前のXAML で定義された既定の Button スタイルを使用する。

MyControl1.xaml で、次の XAML を最後の TextBox 要素の後に追加する。複合コントロールの XAML 部分は此れで完成で有る。

(6)

XAML <Button Grid.Row="5" Grid.Column="0" Name="btnOK" Click="ButtonClicked">OK</Button> <Button Grid.Row="5" Grid.Column="1" Name="btnCancel" Click="ButtonClicked">Cancel</Button> ■ 分離コードファイルの実装 分離コードファイルMyControl1.xaml.vb 又は MyControl1.xaml.cs は、3 つの基本的なタスクを実装 する。 1.ユーザーがボタンの孰れかをクリックした時に発生するイベントを処理する。 2.TextBox 要素からデータを取得し、其のデータをカスタムイベント引数オブジェクトにパッケージ 化する。 3 . ユ ー ザ ー が 操 作 を 終 了 し た 事 を ホ ス ト に 通 知 し 、 入 力 デ ー タ を ホ ス ト に 渡 す カ ス タ ム OnButtonClick イベントを発生させる。 コントロールは、外観を変更する為の色とフォントのプロパティも幾つか公開する。Windows フォー ムコントロールをホストする為に使用されるWindowsFormsHost クラスとは異なり、ElementHost ク ラスはコントロールのBackground プロパティ而巳を公開する。此のコード例と「チュートリアル: WPF でのWindows フォーム複合コントロールのホスト」で説明した例の類似性を保持する為に、此のコン トロールでは残りのプロパティを直接公開する。 分離コードファイルの基本構造 分離コードファイルは、MyControl1 及び MyControlEventArgs と謂う 2 つのクラスを格納する単一の 名前空間で有るMyControls で構成されて居る。 Visual Basic

Public Class MyControl1 End Class

Public Class MyControlEventArgs Inherits EventArgs

End Class

Visual C#

namespace MyControls {

(7)

public class MyControl1 {

//... }

public class MyControlEventArgs : EventArgs { //... } } 最初のクラスで有る MyControl1 は、MyControl1.xaml で定義された UI の機能を実装するコードを格 納する部分クラスで有る。MyControl1.xaml が解析されると、其の XAML は同じ部分クラスに変換さ れ、2 つの部分クラスがマージされて、コンパイルされたコントロールを形成する。此の為、分離コー ドファイル内のクラス名は、MyControl1.xaml に割り当てられたクラス名と一致する必要が有り、コン トロールのルート要素から継承する必要が有る。2 番目のクラスで有る MyControlEventArgs はホスト にデータを返送する為に使用されるイベント引数クラスで有る。 MyControl1.xaml.vb 又は MyControl1.xaml.cs を開く。次の名前に合わせて既存のクラス宣言を変更 し、Grid を継承する(System.Windows.Controls 名前空間をインポートして置くと便利)。 Visual Basic Imports System.Windows Imports System.Windows.Controls Imports System.Windows.Media Partial Public Class MyControl1 Inherits Grid

Visual C#

using System.Windows

using System.Windows.Controls using System.Windows.Media

public partial class MyControl1 : Grid コントロールの初期化 此のコードでは、次の基本タスクを実装する。 ・プライベートイベントで有るOnButtonClick、及び、其のイベントに関連付けられたデリゲートで有 るMyControlEventHandler を宣言する。 ・ユーザーのデータを格納する複数のプライベートグローバル変数を作成する。此のデータは、対応す るプロパティを通じて公開される。 ・コントロールのLoaded イベントのハンドラーInit を実装する。此のハンドラーは、グローバル変数 に MyControl1.xaml で定義された値を割り当てる事に依って、グローバル変数を初期化する。初期

化するには、一般的な TextBlock の要素で有る nameLabel に割り当てられた Name を使用して、 此の要素のプロパティの設定にアクセスする。

(8)

既存のコンストラクターを削除し、次のコードをMyControl1 クラスに追加する。

Visual Basic

Public Delegate Sub MyControlEventHandler(ByVal sender As Object, _ ByVal args As MyControlEventArgs)

Public Event OnButtonClick As MyControlEventHandler Private _fontWeight As FontWeight

Private _fontSize As Double

Private _fontFamily As FontFamily Private _fontStyle As FontStyle

Private _foreground As SolidColorBrush Private _background As SolidColorBrush

Private Sub Init(ByVal sender As Object, ByVal e As EventArgs) _fontWeight = nameLabel.FontWeight

_fontSize = nameLabel.FontSize _fontFamily = nameLabel.FontFamily _fontStyle = nameLabel.FontStyle

_foreground = CType(nameLabel.Foreground, SolidColorBrush) _background = CType(nameLabel.Background, SolidColorBrush) End Sub

Visual C#

public delegate void MyControlEventHandler(object sender, MyControlEventArgs args); public event MyControlEventHandler OnButtonClick;

private FontWeight _fontWeight; private double _fontSize;

private FontFamily _fontFamily; private FontStyle _fontStyle;

private SolidColorBrush _foreground; private SolidColorBrush _background; private void Init(object sender, EventArgs e) {

//They all have the same style, so use nameLabel to set initial values. _fontWeight = nameLabel.FontWeight; _fontSize = nameLabel.FontSize; _fontFamily = nameLabel.FontFamily; _fontStyle = nameLabel.FontStyle; _foreground = (SolidColorBrush)nameLabel.Foreground; _background = (SolidColorBrush)rootElement.Background; } ボタンのクリックイベントの処理 ユーザーは、[OK] ボタン、又は、[Cancel] ボタンをクリックする事に依り、データ入力タスクを完了 した事を示す。此等のボタンは両方とも、同じClick イベントハンドラーで有る ButtonClicked を使用 する。此等のボタンには夫々btnOK 又は btnCancel と謂う名前が付けられて居る。此れに依り、ハン

(9)

ドラーが sender 引数の値を調べる事に依って、孰れのボタンがクリックされたかを判断する事が出来 る。ハンドラーは次の処理を行う。

・TextBox 要素からのデータを格納する MyControlEventArgs オブジェクトを作成する。

・ユーザーが [Cancel] ボタンをクリックした場合に、MyControlEventArgs オブジェクトの IsOK プ ロパティをfalse に設定する。 ・ユーザーが操作を終了した事をホストに示す OnButtonClick イベントを発生させ、収集したデータ を渡す。 次のコードを、MyControl1 クラスの Init メソッドの後に追加する(此のコードを記述する前に、後述 のMyControlEventArgs クラスを記述して置いた方が良い)。 Visual Basic

Private Sub ButtonClicked(ByVal sender As Object, ByVal e As RoutedEventArgs) Dim retvals As MyControlEventArgs = New MyControlEventArgs( _

True, _ txtName.Text, _ txtAddress.Text, _ txtCity.Text, _ txtState.Text, _ txtZip.Text) If sender.Equals(btnCancel) Then retvals.IsOK = False End If

RaiseEvent OnButtonClick(Me, retvals) End Sub

Visual C#

private void ButtonClicked(object sender, RoutedEventArgs e) {

MyControlEventArgs retvals = new MyControlEventArgs( true, txtName.Text, txtAddress.Text, txtCity.Text, txtState.Text, txtZip.Text); if (sender == btnCancel) { retvals.IsOK = false; } if (OnButtonClick != null) OnButtonClick(this, retvals); }

(10)

プロパティの作成 クラスの残りの部分では単純に、前に説明したグローバル変数に対応するプロパティを公開する。プロ パティが変更されると、set アクセサーが対応する要素のプロパティを変更し、基に成るグローバル変 数を更新する事に依って、コントロールの外観を変更する。 MyControl1 クラスに次のコードを追加する。 Visual Basic

Public Property MyControl_FontWeight() As FontWeight Get Return _fontWeight End Get Set(value As FontWeight) _fontWeight = value nameLabel.FontWeight = value addressLabel.FontWeight = value cityLabel.FontWeight = value stateLabel.FontWeight = value zipLabel.FontWeight = value End Set End Property

Public Property MyControl_FontSize() As Double Get Return _fontSize End Get Set(value As Double) _fontSize = value nameLabel.FontSize = value addressLabel.FontSize = value cityLabel.FontSize = value stateLabel.FontSize = value zipLabel.FontSize = value End Set End Property

Public Property MyControl_FontStyle() As FontStyle Get Return _fontStyle End Get Set(value As FontStyle) _fontStyle = value nameLabel.FontStyle = value addressLabel.FontStyle = value cityLabel.FontStyle = value stateLabel.FontStyle = value zipLabel.FontStyle = value

(11)

End Set End Property

Public Property MyControl_FontFamily() As FontFamily Get Return _fontFamily End Get Set(value As FontFamily) _fontFamily = value nameLabel.FontFamily = value addressLabel.FontFamily = value cityLabel.FontFamily = value stateLabel.FontFamily = value zipLabel.FontFamily = value End Set End Property

Public Property MyControl_Background() As SolidColorBrush Get Return _background End Get Set(value As SolidColorBrush) _background = value rootElement.Background = value End Set End Property

Public Property MyControl_Foreground() As SolidColorBrush Get Return _foreground End Get Set(value As SolidColorBrush) _foreground = value nameLabel.Foreground = value addressLabel.Foreground = value cityLabel.Foreground = value stateLabel.Foreground = value zipLabel.Foreground = value End Set End Property Visual C#

public FontWeight MyControl_FontWeight {

get { return _fontWeight; } set

{

(12)

nameLabel.FontWeight = value; addressLabel.FontWeight = value; cityLabel.FontWeight = value; stateLabel.FontWeight = value; zipLabel.FontWeight = value; } }

public double MyControl_FontSize {

get { return _fontSize; } set { _fontSize = value; nameLabel.FontSize = value; addressLabel.FontSize = value; cityLabel.FontSize = value; stateLabel.FontSize = value; zipLabel.FontSize = value; } }

public FontStyle MyControl_FontStyle {

get { return _fontStyle; } set { _fontStyle = value; nameLabel.FontStyle = value; addressLabel.FontStyle = value; cityLabel.FontStyle = value; stateLabel.FontStyle = value; zipLabel.FontStyle = value; } }

public FontFamily MyControl_FontFamily {

get { return _fontFamily; } set { _fontFamily = value; nameLabel.FontFamily = value; addressLabel.FontFamily = value; cityLabel.FontFamily = value; stateLabel.FontFamily = value; zipLabel.FontFamily = value; } }

(13)

{

get { return _background; } set { _background = value; rootElement.Background = value; } }

public SolidColorBrush MyControl_Foreground {

get { return _foreground; } set { _foreground = value; nameLabel.Foreground = value; addressLabel.Foreground = value; cityLabel.Foreground = value; stateLabel.Foreground = value; zipLabel.Foreground = value; } } ホストへのデータの返送 フ ァ イ ル の 最 後 の コ ン ポ ー ネ ン ト は 、 収 集 さ れ た デ ー タ を ホ ス ト に 返 送 す る 為 に 使 用 さ れ る MyControlEventArgs クラスで有る。 MyControls 名前空間に次のコードを追加する。此の実装は簡単なので、此れ以上の説明はしない。 Visual Basic

Public Class MyControlEventArgs Inherits EventArgs

Private _IsOK As Boolean Private _Name As String

Private _StreetAddress As String Private _City As String

Private _State As String Private _Zip As String

Public Sub New(result As Boolean, name As String, address As String, city As String, _ state As String, zip As String)

_IsOK = result _Name = name

_StreetAddress = address _City = city

(14)

_State = state _Zip = zip End Sub

Public Property MyName() As String Get Return _Name End Get Set(value As String) _Name = value End Set End Property

Public Property MyStreetAddress() As String Get Return _StreetAddress End Get Set(value As String) _StreetAddress = value End Set End Property

Public Property MyCity() As String Get Return _City End Get Set(value As String) _City = value End Set End Property

Public Property MyState() As String Get Return _State End Get Set(value As String) _State = value End Set End Property

Public Property MyZip() As String Get Return _Zip End Get Set(value As String) _Zip = value End Set End Property

(15)

Public Property IsOK() As Boolean Get Return _IsOK End Get Set(value As Boolean) _IsOK = value End Set End Property End Class Visual C#

public class MyControlEventArgs : EventArgs {

private string _Name;

private string _StreetAddress; private string _City;

private string _State; private string _Zip; private bool _IsOK;

public MyControlEventArgs(bool result, string name, string address, string city, string state, string zip)

{ _IsOK = result; _Name = name; _StreetAddress = address; _City = city; _State = state; _Zip = zip; }

public string MyName {

get { return _Name; } set { _Name = value; } }

public string MyStreetAddress {

get { return _StreetAddress; } set { _StreetAddress = value; } }

public string MyCity {

get { return _City; } set { _City = value; } }

public string MyState {

(16)

set { _State = value; } }

public string MyZip {

get { return _Zip; } set { _Zip = value; } }

public bool IsOK {

get { return _IsOK; } set { _IsOK = value; } } } ソリューションをビルドする。ビルドでは、MyControls.dll と謂う名前の DLL が生成される。 ※ Express バージョンでは、プロジェクトのプロパティで、アプリケーションの種類を、クラス ライブラリに変更してから、ビルドする(Windows フォームで作成した場合)。 ■ Windows フォームホストアプリケーションの実装 Windows フォームホストアプリケーションは ElementHost オブジェクトを使用して WPF 複合コント ロールをホストする。アプリケーションは、OnButtonClick イベントを処理して、複合コントロールか らデータを受け取る。アプリケーションには、コントロールの外観を変更する為に使用出来るオプショ ンのボタンのセットも有る。次の図は、アプリケーションを示して居る。

(17)

プロジェクトの作成

1.Visual Studio を起動して、[新しいプロジェクト] ダイアログボックスを開く。

2.Visual Basic 又は Visual C#の Windows のカテゴリで、[Windows フォームアプリケーション] テ ンプレートを選択する。 3.新しいプロジェクトにWFHost と謂う名前を付ける。 4.配置場所としては、MyControls プロジェクトの配置先と同じ最上位フォルダーを指定する。 ※ 別々に保存した場合は、前述のプロジェクトで作成した MyControls.dll を此のプロジェクトの プロジェクトフォルダーにコピーして置くと良い。 5.[OK] をクリックして、プロジェクトを作成する。 MyControl1、及び、他のアセンブリを含む DLL への参照も追加する必要が有る。 1.ソリューションエクスプローラーで、プロジェクト名を右クリックし、[参照の追加] を選択する。 2.[参照] タブをクリックし、MyControls.dll を格納して居るフォルダーを参照する。此のチュートリ アルの場合は、MyControls¥bin¥Debug フォルダーで有る。 3.MyControls.dll を選択し、[OK] をクリックする。 4.次のアセンブリへの参照を追加する(孰れも.NET Framework タブに有る)。 ・PresentationCore ・PresentationFramework ・System.Xaml ・WindowsBase ・WindowsFormsIntegration アプリケーションのユーザーインターフェイスの実装 Windows フォームアプリケーションの UI には、WPF 複合コントロールと対話する為の幾つかのコン トロールが含まれて居る。 1.Windows フォームデザイナーで、Form1 を開く。 2.コントロールを配置する為にフォームを拡げる。 3.フォームの右上隅に、WPF 複合コントロールを保持する為の System.Windows.Forms.Panel コン トロールを追加する。 4.次のSystem.Windows.Forms.GroupBox コントロールをフォームに追加する。

(18)

name テキスト groupBox1 背景色 groupBox2 前景色 groupBox3 フォントサイズ groupBox4 フォントファミリ groupBox5 フォントスタイル groupBox6 フォントの太さ groupBox7 コントロールからのデータ 5.次の System.Windows.Forms.RadioButton コントロールを System.Windows.Forms.GroupBox コントロールに追加する。 GroupBox name テキスト groupBox1 radioBackgroundOriginal 標準 groupBox1 radioBackgroundLightGreen ライトグリーン groupBox1 radioBackgroundLightSalmon ライトサーモン groupBox2 radioForegroundOriginal 標準 groupBox2 radioForegroundRed 赤 groupBox2 radioForegroundYellow 黄 groupBox3 radioSizeOriginal 標準 groupBox3 radioSizeTen 10 groupBox3 radioSizeTwelve 12 groupBox4 radioFamilyOriginal 標準

groupBox4 radioFamilyTimes Times New Roman groupBox4 radioFamilyWingDings WingDings

groupBox5 radioStyleOriginal 標準 groupBox5 radioStyleItalic イタリック体 groupBox6 radioWeightOriginal 標準 groupBox6 radioWeightBold 太字 6.次のSystem.Windows.Forms.Label コントロールを最後の System.Windows.Forms.GroupBox に 追加する。此等のコントロールは、WPF 複合コントロールから返されたデータを表示する。 GroupBox name テキスト groupBox7 lblName 名前: groupBox7 lblAddress 番地: groupBox7 lblCity 市区町村: groupBox7 lblState 都道府県: groupBox7 lblZip 郵便番号: フォームの初期化 通常は、フォームのLoad イベントハンドラー内にホスティングコードを実装する。次のコードは、サ ンプルのLoad イベントハンドラー、WPF 複合コントロールの Loaded イベントのハンドラー、及び、 後で使用する幾つかのグローバル変数の宣言を示す。

(19)

Windows フォームデザイナーで、フォームをダブルクリックして Load イベントハンドラーを作成する。 Form1.vb 又は Form1.cs の先頭に、次の Imports 又は using ステートメントを追加する。

Visual Basic Imports System.Windows Imports System.Windows.Forms.Integration Imports System.Windows.Media Visual C# using System.Windows; using System.Windows.Forms.Integration; using System.Windows.Media; 既存のForm1 クラスの内容を次のコードで置き換える。 Visual Basic

Public Class Form1

Private ctrHost As ElementHost

Private wpfAddressCtrl As MyControls.MyControl1 Private initFontWeight As FontWeight

Private initFontSize As Double Private initFontStyle As FontStyle

Private initBackBrush As SolidColorBrush Private initForeBrush As SolidColorBrush Private initFontFamily As FontFamily

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) _ Handles MyBase.Load

ctrHost = New ElementHost() ctrHost.Dock = DockStyle.Fill Panel1.Controls.Add(ctrHost)

wpfAddressCtrl = New MyControls.MyControl1() wpfAddressCtrl.InitializeComponent()

ctrHost.Child = wpfAddressCtrl

AddHandler wpfAddressCtrl.OnButtonClick, AddressOf avAddressCtrl_OnButtonClick AddHandler wpfAddressCtrl.Loaded, AddressOf avAddressCtrl_loaded

End Sub

Private Sub avAddressCtrl_loaded(ByVal sender As Object, ByVal e As EventArgs) initBackBrush = CType(wpfAddressCtrl.MyControl_Background, SolidColorBrush) initForeBrush = wpfAddressCtrl.MyControl_Foreground initFontFamily = wpfAddressCtrl.MyControl_FontFamily initFontSize = wpfAddressCtrl.MyControl_FontSize initFontWeight = wpfAddressCtrl.MyControl_FontWeight initFontStyle = wpfAddressCtrl.MyControl_FontStyle End Sub

(20)

Visual C#

private ElementHost ctrlHost;

private MyControls.MyControl1 wpfAddressCtrl; System.Windows.FontWeight initFontWeight; double initFontSize; System.Windows.FontStyle initFontStyle; System.Windows.Media.SolidColorBrush initBackBrush; System.Windows.Media.SolidColorBrush initForeBrush; System.Windows.Media.FontFamily initFontFamily; public Form1() { InitializeComponent(); }

private void Form1_Load(object sender, EventArgs e) {

ctrlHost = new ElementHost(); ctrlHost.Dock = DockStyle.Fill; panel1.Controls.Add(ctrlHost);

wpfAddressCtrl = new MyControls.MyControl1(); wpfAddressCtrl.InitializeComponent(); ctrlHost.Child = wpfAddressCtrl; wpfAddressCtrl.OnButtonClick += new MyControls.MyControl1.MyControlEventHandler( avAddressCtrl_OnButtonClick);

wpfAddressCtrl.Loaded += new RoutedEventHandler( avAddressCtrl_Loaded);

}

void avAddressCtrl_Loaded(object sender, EventArgs e) { initBackBrush = (SolidColorBrush)wpfAddressCtrl.MyControl_Background; initForeBrush = wpfAddressCtrl.MyControl_Foreground; initFontFamily = wpfAddressCtrl.MyControl_FontFamily; initFontSize = wpfAddressCtrl.MyControl_FontSize; initFontWeight = wpfAddressCtrl.MyControl_FontWeight; initFontStyle = wpfAddressCtrl.MyControl_FontStyle; } 前のコードのForm1_Load メソッドは、WPF コントロールをホストする為の一般的な手順を示す。 1.新しいElementHost オブジェクトを作成する。 2.コントロールのDock プロパティを DockStyle.Fill に設定する。

(21)

4.WPF コントロールのインスタンスを作成する。

5.ElementHost コントロールの Child プロパティにコントロールを割り当てる事に依って、フォー ム上で複合コントロールをホストする。

Form1_Load メソッドの残りの 2 行は、2 つのコントロールイベントにハンドラーをアタッチする。 ・OnButtonClick は、ユーザーが [OK] 又は [Cancel] ボタンをクリックした時に複合コントロールが

発生させるカスタムイベントで有る。此のイベントを処理して、ユーザーの応答を取得し、ユーザー が指定したデータを総て収集する。 ・Loaded は、WPF コントロールが完全に読み込まれた時に此のコントロールが発生させる標準のイベ ントで有る。此処で此のイベントを使用するのは、此の例ではコントロールからのプロパティを使用 して複数のグローバル変数を初期化する必要が有るからで有る。フォームのLoad イベントが発生し た時点では、コントロールは完全には読み込まれて居らず、此等の値は未だnull に設定されて居る。 此等のプロパティにアクセスするには、コントロールのLoaded イベントが発生する迄待つ必要が有 る。 前のコードでは、Loaded イベントハンドラーが示されて居る。OnButtonClick ハンドラーに付いては 次のセクションで説明する。 OnButtonClick の処理

OnButtonClick イベントは、ユーザーが [OK] 又は [Cancel] ボタンをクリックした時に発生する。

イベントハンドラーは、イベント引数のIsOK フィールドをチェックして、孰れのボタンがクリックさ

れたかを判断する。lbl data 変数は、前に説明した Label コントロールに対応する。ユーザーが [OK] ボ タンをクリックすると、コントロールのTextBox コントロールからのデータは、対応する Label コン トロールに割り当てられる。ユーザーが [Cancel] ボタンをクリックした場合、Text の値は既定の文字 列に設定される。

次のボタンクリックイベントハンドラーコードをForm1 クラスに追加する。

Visual Basic

Private Sub avAddressCtrl_OnButtonClick(ByVal sender As Object, _ ByVal args As MyControls.MyControlEventArgs)

If args.IsOK Then lblName.Text = "名前:" + args.MyName lblAddress.Text = "番地:" + args.MyStreetAddress lblCity.Text = "市区町村:" + args.MyCity lblState.Text = "都道府県:" + args.MyState lblZip.Text = "郵便番号:" + args.MyZip Else lblName.Text = "名前:" lblAddress.Text = "番地:" lblCity.Text = "市区町村:" lblState.Text = "都道府県:" lblZip.Text = "郵便番号:" End If

(22)

Visual C# void avAddressCtrl_OnButtonClick( object sender, MyControls.MyControl1.MyControlEventArgs args) { if (args.IsOK) { lblName.Text = "名前:" + args.MyName; lblAddress.Text = "番地:” + args.MyStreetAddress; lblCity.Text = "市区町村:" + args.MyCity; lblState.Text = "都道府県:" + args.MyState; lblZip.Text = "郵便番号:" + args.MyZip; } else { lblName.Text = "名前:; lblAddress.Text = "番地:"; lblCity.Text = "市区町村:"; lblState.Text = "都道府県:"; lblZip.Text = "郵便番号:"; } } アプリケーションをビルドして実行する。WPF 複合コントロールに任意のテキストを追加し、[OK] を クリックする。其のテキストがラベルに表示される。此の時点で、オプションボタンの処理用にコード は追加されて居ない。 コントロールの外観の変更 フォームのRadioButton コントロールを使用すると、ユーザーは WPF 複合コントロールの前景と背景 の色、及び、複数のフォントプロパティを変更出来る。背景色は ElementHost オブジェクトに依って 公開される。残りのプロパティは、コントロールのカスタムプロパティとして公開される。 フォーム上の各 RadioButton コントロールをダブルクリックして CheckedChanged イベントハンドラ ーを作成する。CheckedChanged イベントハンドラーを次のコードで置き換える。 Visual Basic

Private Sub radioBackgroungOriginal_CheckedChanged(sender As System.Object, _ e As System.EventArgs) Handles radioBackgroungOriginal.CheckedChanged wpfAddressCtrl.MyControl_Background = initBackBrush

End Sub

Private Sub radioBackgroungLightGreen_CheckedChanged(sender As System.Object, _ e As System.EventArgs) Handles radioBackgroungLightGreen.CheckedChanged wpfAddressCtrl.MyControl_Background = New SolidColorBrush(Colors.LightGreen) End Sub

(23)

Private Sub radioBackgroungLightSalmon_CheckedChanged(sender As System.Object, _ e As System.EventArgs) Handles radioBackgroungLightSalmon.CheckedChanged wpfAddressCtrl.MyControl_Background = New SolidColorBrush(Colors.LightSalmon) End Sub

Private Sub radioForegroungOriginal_CheckedChanged(sender As System.Object, _ e As System.EventArgs) Handles radioForegroungOriginal.CheckedChanged wpfAddressCtrl.MyControl_Foreground = initForeBrush

End Sub

Private Sub radioForegroungRed_CheckedChanged(sender As System.Object, _ e As System.EventArgs) Handles radioForegroungRed.CheckedChanged wpfAddressCtrl.MyControl_Foreground = New SolidColorBrush(Colors.Red) End Sub

Private Sub radioForegroungYellow_CheckedChanged(sender As System.Object, _ e As System.EventArgs) Handles radioForegroungYellow.CheckedChanged wpfAddressCtrl.MyControl_Foreground = New SolidColorBrush(Colors.Yellow) End Sub

Private Sub radioFamilyOriginal_CheckedChanged(sender As System.Object, _ e As System.EventArgs) Handles radioFamilyOriginal.CheckedChanged wpfAddressCtrl.MyControl_FontFamily = initFontFamily

End Sub

Private Sub radioFamilyTimes_CheckedChanged(sender As System.Object, _ e As System.EventArgs) Handles radioFamilyTimes.CheckedChanged

wpfAddressCtrl.MyControl_FontFamily = New FontFamily("Times New Roman") End Sub

Private Sub radioFamilyWingDings_CheckedChanged(sender As System.Object, _ e As System.EventArgs) Handles radioFamilyWingDings.CheckedChanged wpfAddressCtrl.MyControl_FontFamily = New FontFamily("WingDings") End Sub

Private Sub radioSizeOriginal_CheckedChanged(sender As System.Object, _ e As System.EventArgs) Handles radioSizeOriginal.CheckedChanged wpfAddressCtrl.MyControl_FontSize = initFontSize

End Sub

Private Sub radioSizeTen_CheckedChanged(sender As System.Object, _ e As System.EventArgs) Handles radioSizeTen.CheckedChanged wpfAddressCtrl.MyControl_FontSize = 10

End Sub

Private Sub radioSizeTwelve_CheckedChanged(sender As System.Object, _ e As System.EventArgs) Handles radioSizeTwelve.CheckedChanged wpfAddressCtrl.MyControl_FontSize = 12

(24)

Private Sub radioStyleOriginal_CheckedChanged(sender As System.Object, _ e As System.EventArgs) Handles radioStyleOriginal.CheckedChanged wpfAddressCtrl.MyControl_FontStyle = initFontStyle

End Sub

Private Sub radioStyleItalic_CheckedChanged(sender As System.Object, _ e As System.EventArgs) Handles radioStyleItalic.CheckedChanged wpfAddressCtrl.MyControl_FontStyle = FontStyles.Italic

End Sub

Private Sub radioWeightOriginal_CheckedChanged(sender As System.Object, _ e As System.EventArgs) Handles radioWeightOriginal.CheckedChanged wpfAddressCtrl.MyControl_FontWeight = initFontWeight

End Sub

Private Sub radioWeightBold_CheckedChanged(sender As System.Object, _ e As System.EventArgs) Handles radioWeightBold.CheckedChanged wpfAddressCtrl.MyControl_FontWeight = FontWeights.Bold

End Sub

Visual C#

private void radioBackgroundOriginal_CheckedChanged(object sender, EventArgs e) {

wpfAddressCtrl.MyControl_Background = initBackBrush; }

private void radioBackgroundLightGreen_CheckedChanged(object sender, EventArgs e) {

wpfAddressCtrl.MyControl_Background = new SolidColorBrush(Colors.LightGreen); }

private void radioBackgroundLightSalmon_CheckedChanged(object sender, EventArgs e) {

wpfAddressCtrl.MyControl_Background = new SolidColorBrush(Colors.LightSalmon); }

private void radioForegroundOriginal_CheckedChanged(object sender, EventArgs e) {

wpfAddressCtrl.MyControl_Foreground = initForeBrush; }

private void radioForegroundRed_CheckedChanged(object sender, EventArgs e) {

wpfAddressCtrl.MyControl_Foreground =

new System.Windows.Media.SolidColorBrush(Colors.Red); }

private void radioForegroundYellow_CheckedChanged(object sender, EventArgs e) {

wpfAddressCtrl.MyControl_Foreground =

new System.Windows.Media.SolidColorBrush(Colors.Yellow); }

(25)

private void radioFamilyOriginal_CheckedChanged(object sender, EventArgs e) {

wpfAddressCtrl.MyControl_FontFamily = initFontFamily; }

private void radioFamilyTimes_CheckedChanged(object sender, EventArgs e) {

wpfAddressCtrl.MyControl_FontFamily =

new System.Windows.Media.FontFamily("Times New Roman"); }

private void radioFamilyWingDings_CheckedChanged(object sender, EventArgs e) {

wpfAddressCtrl.MyControl_FontFamily =

new System.Windows.Media.FontFamily("WingDings"); }

private void radioSizeOriginal_CheckedChanged(object sender, EventArgs e) {

wpfAddressCtrl.MyControl_FontSize = initFontSize; }

private void radioSizeTen_CheckedChanged(object sender, EventArgs e) {

wpfAddressCtrl.MyControl_FontSize = 10; }

private void radioSizeTwelve_CheckedChanged(object sender, EventArgs e) {

wpfAddressCtrl.MyControl_FontSize = 12; }

private void radioStyleOriginal_CheckedChanged(object sender, EventArgs e) {

wpfAddressCtrl.MyControl_FontStyle = initFontStyle; }

private void radioStyleItalic_CheckedChanged(object sender, EventArgs e) {

wpfAddressCtrl.MyControl_FontStyle = System.Windows.FontStyles.Italic; }

private void radioWeightOriginal_CheckedChanged(object sender, EventArgs e) {

wpfAddressCtrl.MyControl_FontWeight = initFontWeight; }

private void radioWeightBold_CheckedChanged(object sender, EventArgs e) {

wpfAddressCtrl.MyControl_FontWeight = FontWeights.Bold; }

(26)

アプリケーションをビルドして実行する。別のオプションボタンをクリックして、WPF 複合コントロ ール上の影響を確認する。

http://msdn.microsoft.com/ja-jp/library/ms742215(v=vs.110).aspx http://msdn.microsoft.com/ja-jp/library/ee649089(v=vs.110).aspx

参照

関連したドキュメント

So far, most spectral and analytic properties mirror of M Z 0 those of periodic Schr¨odinger operators, but there are two important differences: (i) M 0 is not bounded from below

In addition, under the above assumptions, we show, as in the uniform norm, that a function in L 1 (K, ν) has a strongly unique best approximant if and only if the best

The explicit treatment of the metaplectic representa- tion requires various methods from analysis and geometry, in addition to the algebraic methods; and it is our aim in a series

We have avoided most of the references to the theory of semisimple Lie groups and representation theory, and instead given direct constructions of the key objects, such as for

Bipartite maps (also called hypermaps, or dessins d’enfants ) : vertices are either black or white, and monochromatic edges

Thank you, Sabers Nation, for your participation in the coronavirus SA- BERStrong Pushup Challenge. Sabers students, teachers, graduates, and parents showed their mental and

地球温暖化対策報告書制度 における 再エネ利用評価

72 British journal of educational studies/Blackwell Publishing Limited 73 British journal of sociology of education/Taylor &amp; Francis 74 Child abuse &amp; neglect : the