次の方法で共有


チュートリアル : サードパーティの Windows フォーム コントロールの WPF アプリケーションでのホスト

更新 : 2010 年 9 月

このチュートリアルでは、WPF Designer for Visual Studio を使用して、サードパーティの Windows フォーム コントロールを WPF アプリケーションでホストする方法について説明します。 Windows フォームと WPF 間の相互運用性の詳細については、「移行と相互運用性」を参照してください。

このチュートリアルでは、MonthCalendar コントロールを、サードパーティ コントロールとして使用します。 Controls コレクション内に MonthCalendar コントロールのインスタンスを持つ UserControl 型を作成します。 UserControl 型が Date プロパティを公開し、MonthCalendar コントロールの動作を定義するカスタム ロジックを実装します。 WPF アプリケーションでは、TextBlock 要素は Date プロパティにバインドされます。

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

  • WPF プロジェクトを作成する。

  • サードパーティ コントロールをカプセル化する Windows フォーム ユーザー コントロールを作成する。

  • Windows フォーム ユーザー コントロールを WPF アプリケーションでホストする。

最終的なアプリケーションを次の図に示します。

ホストされている Windows フォーム コントロール

注意

実際に画面に表示されるダイアログ ボックスとメニュー コマンドは、アクティブな設定またはエディションによっては、ヘルプの説明と異なる場合があります。 設定を変更するには、[ツール] メニューの [設定のインポートとエクスポート] をクリックします。 詳細については、「設定の操作」を参照してください。

必須コンポーネント

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

  • Visual Studio 2010。

WPF プロジェクトの作成

最初に、ホスト アプリケーションとして WPF プロジェクトを作成します。

プロジェクトを作成するには

  1. Visual Basic または Visual C# で HostingMonthCalendar という名前の WPF アプリケーション プロジェクトを作成します。 詳細については、「方法 : 新しい WPF アプリケーション プロジェクトを作成する」を参照してください。

    WPF デザイナーで MainWindow.xaml が開きます。

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

Windows フォームの複合コントロールの作成

ここでは、UserControl クラスから派生する型によって複合コントロールを作成する方法について説明します。

Windows フォームの複合コントロールを作成するには

  1. Visual Basic または Visual C# の VendorControlLibrary という名前の新しい Windows フォーム コントロール ライブラリ プロジェクトをソリューションに追加します。 詳細については、「方法 : ソリューション項目を追加および削除する」を参照してください。

    Windows フォーム デザイナーで、UserControl1 が開きます。

  2. ソリューション エクスプローラーで、UserControl1 ファイルを右クリックし、[名前の変更] をクリックします。

  3. コントロールの名前を VendorControl に変更します。 すべての参照名を変更するかどうかを確認するメッセージが表示されたら、[はい] をクリックします。

  4. デザイン サーフェイス上で VendorControl を選択します。

  5. [プロパティ] ウィンドウで、Size プロパティの値を 200,200 に設定します。

  6. ツールボックスMonthCalendar コントロールをダブルクリックします。

    MonthCalendar コントロールがデザイン サーフェイスに表示されます。

  7. [プロパティ] ウィンドウで、MonthCalendar コントロールに対して次のプロパティを設定します。

    プロパティ

    Margin

    0,0,0,0

    ShowToday

    False

  8. VendorControl のサイズを MonthCalendar コントロールのサイズと一致するように設定します。

  9. MonthCalendar コントロールを選択します。

  10. [プロパティ] ウィンドウで、[イベント] タブをクリックし、DateChanged イベントをダブルクリックします。

    コード エディターで VendorControl ファイルが開き、DateChanged イベントのイベント ハンドラーが追加されます。

  11. 既存のコードを次のコードに置き換えます。 このコードは、Date プロパティを定義し、さらに、MonthCalendar コントロールの日付範囲プロパティである SelectionStartSelectionEndTodayDate と同じ値にするロジックを定義します。 また、このコードにより、WPF データ バインディングで使用される INotifyPropertyChanged インターフェイスが実装されます。

    Imports System
    Imports System.Collections.Generic
    Imports System.ComponentModel
    Imports System.Drawing
    Imports System.Data
    Imports System.Linq
    Imports System.Text
    Imports System.Windows.Forms
    
    Public Class VendorControl
        Inherits UserControl
        Implements INotifyPropertyChanged
    
        <Browsable(True)> _
        Public Property [Date]() As String
            Get
                Return Me.MonthCalendar1.TodayDate.ToShortDateString()
            End Get
    
            Set(ByVal value As String)
                If value <> Me.MonthCalendar1.TodayDate.ToShortDateString() Then
                    Dim newDate As DateTime = DateTime.Parse(value)
                    Me.SetDate(newDate)
                    Me.NotifyPropertyChanged("Date")
                End If
            End Set
        End Property
    
    
        Private Sub monthCalendar1_DateChanged( _
            ByVal sender As Object, ByVal e As DateRangeEventArgs) _
        Handles MonthCalendar1.DateChanged
            Me.SetDate(e.Start)
            Me.NotifyPropertyChanged("Date")
    
        End Sub
    
    
        Private Sub SetDate(ByVal [date] As DateTime)
            Me.MonthCalendar1.TodayDate = [date]
            Me.MonthCalendar1.SelectionStart = [date]
            Me.MonthCalendar1.SelectionEnd = [date]
    
        End Sub
    
    #Region "INotifyPropertyChanged Implementation"
    
        Public Event PropertyChanged As PropertyChangedEventHandler _
            Implements INotifyPropertyChanged.PropertyChanged
    
        Private Sub NotifyPropertyChanged(ByVal info As String)
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
        End Sub
    
    #End Region
    End Class
    
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace VendorControlLibrary
    {
        public partial class VendorControl : UserControl, INotifyPropertyChanged
        {
            public VendorControl()
            {
                InitializeComponent();
            }
    
            [Browsable(true)]
            public string Date
            {
                get
                {
                    return this.monthCalendar1.TodayDate.ToShortDateString();
                }
    
                set
                {
                    if (value != this.monthCalendar1.TodayDate.ToShortDateString())
                    {
                        DateTime newDate = DateTime.Parse(value);
                        this.SetDate(newDate);
                        this.OnPropertyChanged("Date");
                    }
                }
            }
    
            private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e)
            {
                this.SetDate(e.Start);
                this.OnPropertyChanged("Date");
            }
    
            private void SetDate(DateTime date)
            {
                this.monthCalendar1.TodayDate = date;
                this.monthCalendar1.SelectionStart = date;
                this.monthCalendar1.SelectionEnd = date;
            }
    
            #region INotifyPropertyChanged Implementation
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            private void OnPropertyChanged(string propertyName)
            {
                if (this.PropertyChanged != null)
                {
                    this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
    
            #endregion
        }
    }
    
  12. [ビルド] メニューの [ソリューションのビルド] をクリックして、ソリューションをビルドします。

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

WindowsFormsHost 要素を使用して、VendorControl を WPF アプリケーションでホストします。

WPF で Windows フォーム コントロールをホストするには

  1. ソリューション エクスプローラーの HostingMonthCalendar プロジェクトに、VendorControlLibrary プロジェクトへの参照を追加します。 詳細については、「方法: Visual Studio で参照を追加または削除する」を参照してください。

  2. WPF デザイナーで MainWindow.xaml を開きます。

  3. [ツールボックス] からデザイン サーフェイスに WindowsFormsHost コントロールをドラッグします。

    WindowsFormsIntegration.dll という名前のアセンブリへの参照が HostingMonthCalendar プロジェクトに追加されます。

  4. XAML ビューで、既存のマークアップを次のマークアップに置き換えます。 この XAML により、VendorControlLibrary 名前空間がマップされ、TextBlock 要素が VendorControl の Date プロパティにバインドされます。

    <Window x:Class="HostingMonthCalendar.MainWindow"
        xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:v="clr-namespace:VendorControlLibrary;assembly=VendorControlLibrary"
        Title="Window1" Height="300" Width="300">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition />
            </Grid.RowDefinitions>
    
            <WindowsFormsHost Name="Host" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center">
                <v:VendorControl Date="2/2/03" />
            </WindowsFormsHost>
    
            <TextBlock Grid.Row="1" 
                       Text="{Binding ElementName=Host, Path=Child.Date, Mode=OneWay, UpdateSourceTrigger=PropertyChanged }" 
                       HorizontalAlignment="Stretch" 
                       VerticalAlignment="Center" 
                       TextAlignment="Center" 
                       TextDecorations="None" 
                       FontSize="24" />
        </Grid>
    </Window>
    
  5. [デバッグ] メニューの [デバッグ開始] をクリックします。

  6. MonthCalendar コントロールをクリックして、現在の日付を変更します。 WPF TextBlock 要素が、選択した日付に更新されます。

次の手順

  • コントロールを WPF 環境で幅広く使用する場合には、WindowsFormsHost からの独自の派生クラスを作成し、Date プロパティを公開することができます。 これにより、Path=Child.Date 構文を使用しなくても、他の WPF コントロールを Date プロパティに直接バインドできるようになります。

  • WPF コントロールを Windows フォームでホストすることもできます。 詳細については、「WPF コントロールの使用」を参照してください。

参照

処理手順

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

参照

WindowsFormsHost

ElementHost

その他の技術情報

WPF デザイナーでのコントロールの操作

移行と相互運用性

履歴の変更

日付

履歴

理由

2010 年 9 月

不足していた手順が追加されました。

カスタマー フィードバック