Share via


チュートリアル : Windows フォームでの Windows Presentation Foundation コントロールのホスト

更新 : 2007 年 11 月

Windows Presentation Foundation (WPF) は、アプリケーションの作成に適した環境を提供します。ただし、Windows フォームのコードに多大な手間と時間をかけた場合は、コードを最初から記述し直すよりも、既存の Windows フォーム アプリケーションを WPF で拡張する方が効率的となることもあります。一般的なシナリオとしては、Windows フォーム アプリケーション内に、WPF を使用して実装したページを埋め込む場合が挙げられます。

このチュートリアルでは、Windows フォーム アプリケーションで WPF ページをホストするアプリケーションについて段階的に説明します。このページは、DLL にパッケージ化された単純なデータ入力アプリケーションです。この例は、外観および機能が「Windows Presentation Foundation での Windows フォーム複合コントロールのホストのサンプル」の例とほぼ同じになるように設計されています。主な違いは、ホストする側とされる側が逆であることです。

メモ :

ホストされたページは、厳密には WPF コントロールではありません。むしろ、DLL 内にパッケージ化された通常の WPF ページです。ただし、フォーム上で WPF コントロールをホストする手法は、通常のページをホストするために使用される手法と同じです。WPF コントロールの詳細については、「コントロールのカスタマイズ」を参照してください。

チュートリアルは、2 つのセクションに分かれています。最初のセクションでは、WPF ページの実装について簡単に説明します。2 番目のセクションでは、Windows フォーム アプリケーション内でページをホストし、そのページからイベントを受け取って、同ページのプロパティの一部にアクセスする方法について詳しく説明します。

このチュートリアルでは、以下のタスクを行います。

  • Windows Presentation Foundation ページを実装する。

  • Windows フォーム ホスト アプリケーションを実装する。

このチュートリアルで示すタスクの完全なコード一覧については、「Windows フォームでの簡単な Windows Presentation Foundation コントロールのホストのサンプル」を参照してください。

必要条件

このチュートリアルを完了するには、次のコンポーネントが必要です。

  • Visual Studio 2008

Windows Presentation Foundation ページの実装

この例で使用される WPF ページは、ユーザーの名前と住所を受け取る単純なデータ入力フォームです。ユーザーが 2 つのボタンのいずれかをクリックして入力操作が終了したことを示すと、ページは入力情報をホストに返すカスタム イベントを発生させます。このページのフォームや機能は、「チュートリアル : Windows Presentation Foundation での Windows フォーム複合コントロールのホスト」で使用される Windows フォーム コントロールと基本的に同じものです。Windows フォームのフォーム上でホストするためにページをカスタマイズする際に、特別なことは行いません。より大きい WPF ページの Frame にページを簡単に読み込むことができます。レンダリングされるページを次の図に示します。

Windows Presentation Foundation ページ

単純な WPF コントロール

プロジェクトの作成

プロジェクトを開始するには

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

  2. テンプレートとして [WPF ブラウザ アプリケーション] を選択します。

  3. 新しいプロジェクトに MyControls という名前を付け、WfHostingWpf など、わかりやすい名前を付けたトップレベルのフォルダ内に配置します。このフォルダには後でホスト アプリケーションも配置します。[OK] をクリックして、プロジェクトを作成します。既定のプロジェクトには、Page1 という名前の単一ページが含まれます。

  4. ソリューション エクスプローラで、プロジェクト名を右クリックし、[プロパティ] をクリックします。

  5. [Output type] を [クラス ライブラリ] に設定して、ページを DLL としてコンパイルします。

  6. プロジェクトからアプリケーション定義ファイルである MyApp.xaml および MyApp.xaml.cs を削除します。これらのファイルは、ページをアプリケーションとして実装する場合にのみ必要です。

メモ :

WPF アプリケーションをクラス ライブラリとしてコンパイルすると、このアプリケーションを起動して、レンダリングされるページを表示することができません。このため、アプリケーションが完全に実装されるまで、出力の種類を [Windows アプリケーション] にしておくと便利な場合があります。このようにすると、アプリケーションを起動して、ページの外観を確認できます。表示確認が終了したら、アプリケーション定義ファイルを削除し、出力の種類を [クラス ライブラリ] に変更して DLL としてコンパイルします。

プロジェクトは、次のシステム DLL を参照している必要があります。これらの DLL のいずれかが既定で含まれていない場合は、プロジェクトに追加します。

  • System

  • PresentationCore

  • PresentationFramework

  • WindowsBase

ページのユーザー インターフェイスの実装

WPF ページのユーザー インターフェイス (UI) は Extensible Application Markup Language (XAML) を使用して実装されます。これは、外観と機能が「チュートリアル : Windows Presentation Foundation での Windows フォーム複合コントロールのホスト」で説明されている Windows フォーム コントロールと同様になるように設計されています。このページのデータ入力 UI は 5 つの TextBox 要素で構成されています。各 TextBox 要素には、ラベルとして使用される TextBlock 要素が関連付けられています。ページの下部には [OK] および [Cancel] という 2 つの Button 要素があります。ユーザーがいずれかのボタンをクリックすると、ページは情報をホストに返すカスタム イベントを発生させます。

基本的なレイアウト

Grid 要素には、さまざまな UI 要素が格納されます。Grid を使用して、HTML で Table 要素を使用する場合とほとんど同じ方法で、ページのコンテンツを配置できます。WPF には Table 要素もありますが、Grid の方が軽量で、単純なレイアウト タスクに適しています。

基本的なレイアウト コードを次の例に示します。このコードは、Grid 要素内の列と行の数を指定することによってページの全体の構造を定義します。このコードを使用して Page1.xaml 内のコードを置き換えます。

<Grid xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
      x:Class="MyControls.Page1"
      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>

TextBlock 要素および TextBox 要素のグリッドへの追加

グリッドに UI 要素を配置するには、その要素の RowProperty および ColumnProperty 属性に適切な行番号と列番号を設定します。行と列の番号付けは 0 から始まる点に注意してください。ColumnSpanProperty 属性を設定することによって、1 つの要素を複数の列にまたがって表示することができます。Grid 要素の詳細については、「方法 : グリッド要素を作成する」を参照してください。

次の例では、ページの TextBox 要素および TextBlock 要素に、各要素がグリッド内に適切に配置されるように RowProperty 属性と ColumnProperty 属性が設定されています。このコードを Page1.xaml の Grid 要素のすぐ下に追加します。

<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"
      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"/>

UI 要素のスタイル設定

データ入力フォームの多くの要素は、外観が似ています。つまり、それらの要素ではいくつかのプロパティの設定が同一になります。次のコード例では、各要素の属性を個別に設定するのではなく、Style 要素を使用して、複数の要素のクラスの標準プロパティ設定を定義します。この方法では、ページの複雑さが軽減され、1 つのスタイル属性を使用して複数の要素の外観を変更できます。

Style 要素は Grid 要素の Resources プロパティに格納されるため、ページ上のすべての要素で使用できます。スタイルに名前が付いている場合は、そのスタイルの名前に設定された Style 要素を追加することによって、要素にそのスタイルを適用します。名前が付いていないスタイルは、要素の既定のスタイルになります。WPF スタイルの詳細については、「スタイルとテンプレート」を参照してください。

WPF ぺージの Style 要素を次の例に示します。このコードを Page1.xaml の Grid 要素のすぐ下に追加します。スタイルが要素にどのように適用されるかについては、前のコード例を参照してください。たとえば、最後の TextBlock 要素には inlineText スタイルが適用され、最後の TextBox 要素は既定のスタイルを使用します。

<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>

[OK] および [Cancel] ボタンの追加

ページ上の最後の要素は、Grid の最後の行の最初の 2 つの列を専有する [OK] および [Cancel] の Button 要素です。これらの要素は、共通のイベント ハンドラである ButtonClicked、および前のコード例で定義された既定の Button スタイルを使用します。次のコードを Page1.xaml の最後の TextBox 要素のすぐ下に追加します。これで、ページの 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>

ページの分離コード ファイルの実装

WPF ページの分離コード ファイルである Page1.xaml.cs は、次の 4 つの必須タスクを実装します。

  1. ページの読み込み元が判明するように、ページの DLL 名を Application オブジェクトを使用して登録します。

  2. ユーザーがボタンのいずれかをクリックしたときに発生するイベントを処理します。

  3. TextBox 要素からデータを取得し、そのデータをカスタム イベント引数オブジェクトにパッケージ化します。

  4. ユーザーが操作を終了したことをホストに通知し、入力データをホストに渡すカスタム OnButtonClick イベントを発生させます。

ページは、ページの外観を制御するための色とフォントのプロパティもいくつか公開します。Windows フォーム コントロールをホストするために使用される WindowsFormsHost クラスとは異なり、ElementHost クラスはページの Background プロパティのみを公開します。このコード例と「チュートリアル : Windows Presentation Foundation での Windows フォーム複合コントロールのホスト」で説明した例の類似性を保持するために、このページでは残りのプロパティを直接公開します。

分離コード ファイルの基本構造

分離コード ファイルは、Page1 および MyControlEventArgs という 2 つのクラスを格納する単一の名前空間である MyControls で構成されています。Page1.xaml.cs 内のコードを次のコードに置き換えます。

using System;
using System.Windows;
using System.Windows.Navigation;
using System.Windows.Controls;
using System.Windows.Media;

namespace MyControls
{
  public partial class Page1 : Grid
  {
    //...
  }
  public class MyControlEventArgs : EventArgs
  {
    //...
  }
}

最初のクラスである Page1 は、Page1.xaml で定義された UI の機能を実装するコードを格納する部分クラスです。Page1.xaml が解析されると、その XAML は同じ部分クラスに変換され、2 つの部分クラスがマージされて、コンパイルされたページを形成します。このため、分離コード ファイル内のクラス名は、Page1.xaml に割り当てられたクラス名と一致する必要があり、ページのルート要素から継承する必要があります。2 番目のクラスである MyControlEventArgs はホストにデータを返送するために使用されるイベント引数クラスです。

Page1 クラスの初期化

このコード例では、次の基本タスクを実装します。

  • プライベート イベントである OnButtonClick、およびそのイベントに関連付けられたデリゲートである MyControlEventHandler を宣言します。

  • ユーザーのデータを格納する複数のプライベート グローバル変数を作成します。このデータは、対応するプロパティを通じて公開されます。

  • ページの Loaded イベントのハンドラである Init を実装します。このハンドラは、グローバル変数に Page1.xaml で定義された値を割り当てることによって、グローバル変数を初期化します。初期化するには、一般的な TextBlock の要素である nameLabel に割り当てられた Name を使用して、この要素のプロパティの設定にアクセスします。

Page1 クラスに次のコードを追加します。

public partial class Page1 : Grid
{
    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 または btnFalse という名前が付けられています。これにより、ハンドラが sender 引数の値を調べることによって、どちらのボタンがクリックされたかを判断することができます。ハンドラは次の処理を行います。

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

  • ユーザーが [Cancel] ボタンをクリックした場合に、MyControlEventArgs オブジェクトの IsOK プロパティを false に設定します。

  • ユーザーが操作を終了したことをホストに示す OnButtonClick イベントを発生させ、収集したデータを渡します。

次のコードを Page1 クラスの Init メソッドの下に追加します。

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);
}

プロパティの作成

クラスの残りの部分では単純に、前に説明したグローバル変数に対応するプロパティを公開します。プロパティが変更されると、set アクセサが対応する要素のプロパティを変更し、基になるグローバル変数を更新することによって、ページの外観を変更します。

Page1 クラスに次のコードを追加します。

public FontWeight MyControl_FontWeight
{
    get { return _fontWeight; }
    set
    {
        _fontWeight = value;
        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;
    }
}

public SolidColorBrush MyControl_Background
{
    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 名前空間に次のコードを追加します。この実装は簡単なので、これ以上の説明はしません。

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
    {
        get { return _State; }
        set { _State = value; }
    }
    public string MyZip
    {
        get { return _Zip; }
        set { _Zip = value; }
    }
    public bool IsOK
    {
        get { return _IsOK; }
        set { _IsOK = value; }
    }
}

Windows フォーム ホスト アプリケーションの実装

Windows フォーム ホスト アプリケーションは ElementHost オブジェクトを使用してフォーム上で WPF ページをホストします。このアプリケーションは、ページの OnButtonClick イベントを処理して、フォームからデータを受け取ります。アプリケーションには、ページの外観を変更するために使用できるオプションのボタンのセットもあります。レンダリングされるフォームを次のスクリーン ショットに示します。

Windows フォーム アプリケーションでホストされた Windows Presentation Foundation ページ

Avalon コントロールをホストする Windows フォーム

プロジェクトの作成

プロジェクトを開始するには

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

  2. [Windows フォーム アプリケーション] テンプレートを使用して [C# Projects] を選択します。

  3. 新しいプロジェクトに WFHost という名前を付け、MyControls プロジェクトが格納されているトップ レベル フォルダに配置します。[OK] をクリックして、プロジェクトを作成します。

WPF ページを格納する DLL への参照も追加する必要があります。

  1. ソリューション エクスプローラで、プロジェクト名を右クリックし、[参照の追加] をクリックします。

  2. [参照] タブをクリックし、MyControls.dll を格納しているフォルダに移動します。

  3. MyControls.dll を選択し、[OK] をクリックして参照の一覧にこの DLL を追加します。

  4. ソリューション エクスプローラで、WindowsFormsIntegration.dll という名前の WindowsFormsIntegration アセンブリへの参照を追加します。

フォームのユーザー インターフェイス設計の実装

Windows フォーム デザイナを開き、「Windows フォーム ホスト アプリケーションの実装」で示した図に表示されているようにフォームをレイアウトします。

  1. コントロール群と WPF ページが収まるように、既定のフォームを拡張します。

  2. System.Windows.Forms.Panel コントロールをフォームの右上隅に追加して、WPF ページを保持します。

  3. 図に示すように、System.Windows.Forms.RadioButton コントロールのセットを 6 つ追加します。

  4. 図に示すように、5 つの System.Windows.Forms.Label コントロールをフォームの右下隅に追加します。これらのコントロールは、WPF コントロールから返されるデータのラベルとして機能します。

  5. Label コントロールを前の手順で追加された各 Label コントロールの右に追加します。各コントロールの Text プロパティを "" に設定します。これらのコントロールは、WPF コントロールから返されたデータを表示します。

  6. 直前の 2 つの手順で追加したコントロールのグループに対するタイトルとして使用する別の Label コントロールを追加します。この Label は、グループのタイトルとして使用することを目的としているため、フォント サイズをグループ内のコントロールより 2 ポイント大きくします。

フォームの初期化

通常は、フォームの Load イベント ハンドラ内にホスティング コードを実装します。Windows フォーム デザイナで、フォームをダブル クリックして Load イベント ハンドラ メソッドを作成します。次のコード例には、サンプルの Load イベント ハンドラ、WPF ページの Loaded イベントのハンドラ、および後から使用される複数のグローバル変数の宣言が含まれています。Form1.cs のコードを次のコードに置き換えます。

partial class Form1 : Form
{
    private ElementHost ctrlHost;
    private MyControls.Page1 wpfAddressCtrl;
    System.Windows.FontWeight initFontWeight;
    double initFontSize;
    System.Windows.FontStyle initFontStyle;
    System.Windows.Media.SolidColorBrush initBackBrush;
    System.Windows.Media.SolidColorBrush initForeBrush;
    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.Page1();
        wpfAddressCtrl.InitializeComponent();
        ctrlHost.Child = wpfAddressCtrl;

        wpfAddressCtrl.OnButtonClick += 
            new MyControls.Page1.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 に設定します。

  3. ElementHost コントロールを Panel コントロールの Controls コレクションに追加します。

  4. WPF ページのインスタンスを作成します。

  5. ElementHost コントロールの Child プロパティにページを割り当てることによって、フォーム上でページをホストします。

Form1_Load メソッドの残りの 2 行は、2 つのページ イベントにハンドラをアタッチします。

  • OnButtonClick は、ユーザーが [OK] または [Cancel] ボタンをクリックしたときにページが発生させるカスタム イベントです。このイベントを処理して、ユーザーの応答を取得し、ユーザーが入力したデータをすべて収集します。

  • Loaded は、WPF ページが完全に読み込まれたときにこのページが発生させる標準のイベントです。ここでこのイベントを使用するのは、このサンプルではページからのプロパティを使用して複数のグローバル変数を初期化する必要があるからです。フォームの Load イベントが発生した時点では、ページは完全には読み込まれておらず、これらの値はまだ null に設定されています。これらのプロパティにアクセスするには、ページの Loaded イベントが発生するまで待つ必要があります。

前のコード例では、Loaded イベント ハンドラが示されています。OnButtonClick ハンドラについては次のセクションで説明します。

OnButtonClick の処理

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

イベント ハンドラは、イベント引数の IsOK フィールドをチェックして、どちらのボタンがクリックされたかを判断します。lbldata 変数は、前に説明した非表示の Label コントロールに対応します。ユーザーが [OK] ボタンをクリックすると、ページの TextBox コントロールからのデータは、対応する Label コントロールに割り当てられます。ユーザーが [Cancel] ボタンをクリックした場合は、Text の値は null に設定されます。

Form1.cs に次のコードを追加します。これで、アプリケーションをコンパイルして実行できます。

void avAddressCtrl_OnButtonClick(
    object sender, 
    MyControls.MyControlEventArgs args)
{
    if (args.IsOK)
    {
        lblAddress.Text = "Street Address: " + args.MyStreetAddress;
        lblCity.Text = "City: " + args.MyCity;
        lblName.Text = "Name: " + args.MyName;
        lblState.Text = "State: " + args.MyState;
        lblZip.Text = "Zip: " + args.MyZip;
    }
    else
    {
        lblAddress.Text = "Street Address: ";
        lblCity.Text = "City: ";
        lblName.Text = "Name: ";
        lblState.Text = "State: ";
        lblZip.Text = "Zip: ";
    }
}

Windows Presentation Foundation ページの外観の変更

フォームの左側の RadioButton コントロールを使用すると、ユーザーは WPF ページの前景と背景の色、および複数のフォント プロパティを変更できます。背景色は ElementHost オブジェクトによって公開されます。残りのプロパティは、ページのカスタム プロパティとして公開されます。

フォーム上の RadioButton コントロールをダブルクリックして、対応する CheckedChanged イベント ハンドラのテンプレートを作成します。次のハンドラからコードを抽出し、それを Form1.cs 内の対応するハンドラに追加します。

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);
}

private void radioFamilyOriginal_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontFamily = initFontFamily;
}

private void radioFamilyTimes_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontFamily = new FontFamily("Times New Roman");
}

private void radioFamilyWingDings_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontFamily = new 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;
}

参照

処理手順

チュートリアル : Windows フォームでの Windows Presentation Foundation 複合コントロールのホスト

概念

チュートリアル : Windows Presentation Foundation での Windows フォーム複合コントロールのホスト

参照

ElementHost

WindowsFormsHost

その他の技術情報

WPF デザイナ