次の方法で共有


Windows Presentation Foundation の概要

Windows Presentation Foundation (WPF) のデスクトップ ガイドへようこそ。これは、解像度に依存せず、ベクターベースのレンダリング エンジンを使用する UI フレームワークであり、最新のグラフィックス ハードウェアを利用するように構築されています。 WPF には、拡張可能なアプリケーション マークアップ言語 (XAML)、コントロール、データ バインディング、レイアウト、2D および 3D グラフィックス、アニメーション、スタイル、テンプレート、ドキュメント、メディア、テキスト、文字体裁などのアプリケーション開発機能の包括的なセットが用意されています。 WPF は .NET の一部です。そのため、.NET API の他の要素を組み込むアプリケーションを構築できます。

WPF には、次の 2 つの実装があります。

  1. .NET バージョン (このガイド):

    .NET 上で実行される GitHub でホストされる WPF のオープンソース実装。 XAML デザイナーには、少なくとも Visual Studio 2019 バージョン 16.8 が必要です。 ただし、.NET のバージョンによっては、新しいバージョンの Visual Studio を使用する必要がある場合があります。

    .NET はクロスプラットフォーム テクノロジですが、WPF は Windows でのみ実行されます。

  2. .NET Framework 4 バージョン:

    Visual Studio 2019 および Visual Studio 2017 でサポートされている WPF の .NET Framework 実装。

    .NET Framework 4 は .NET の Windows のみのバージョンであり、Windows オペレーティング システムのコンポーネントと見なされます。 このバージョンの WPF は、.NET Framework と共に配布されます。

この概要は新規ユーザーを対象としており、WPF の主要な機能と概念について説明します。 WPF アプリを作成する方法については、「 チュートリアル: 新しい WPF アプリを作成する」を参照してください。

.NET Framework からアップグレードする理由

アプリケーションを .NET Framework から .NET にアップグレードする場合は、次の利点があります。

  • パフォーマンスの向上
  • 新しい .NET API
  • 最新の言語改善
  • アクセシビリティと信頼性の向上
  • 更新されたツールなど

アプリケーションをアップグレードする方法については、「 WPF デスクトップ アプリを .NET にアップグレードする方法」を参照してください。

WPF を使用したプログラム

WPF は、主に System.Windows 名前空間にある .NET 型のサブセットとして存在します。 ASP.NET や Windows フォームなどのフレームワークを使用して .NET を使用してアプリケーションを構築したことがある場合は、基本的な WPF プログラミング エクスペリエンスを理解しておく必要があります。

  • クラスをインスタンス化する
  • プロパティの設定
  • メソッドを呼び出す
  • イベントの処理

WPF には、プロパティとイベント ( 依存関係プロパティルーティング イベント) を強化するより多くのプログラミングコンストラクトが含まれています。

マークアップとコードビハインド

WPF を使用すると、 マークアップ分離コードの両方を使用してアプリケーションを開発できます。これは、開発者 ASP.NET 使い慣れている必要があるエクスペリエンスです。 一般に、XAML マークアップを使用してアプリケーションの外観を実装し、マネージド プログラミング言語 (分離コード) を使用してその動作を実装します。 外観と動作の分離には、次の利点があります。

  • 外観固有のマークアップが動作固有のコードと密接に結合されていないため、開発とメンテナンスのコストが削減されます。

  • デザイナーは、アプリケーションの動作を実装している開発者と同時にアプリケーションの外観を実装できるため、開発はより効率的です。

  • WPF アプリケーションのグローバリゼーションとローカライズが簡略化されました。

マークアップ

XAML は、アプリケーションの外観を宣言によって実装する XML ベースのマークアップ言語です。 通常は、ウィンドウ、ダイアログ ボックス、ページ、およびユーザー コントロールを定義し、コントロール、図形、グラフィックスで塗りつぶすために使用します。

次の例では、XAML を使用して、1 つのボタンを含むウィンドウの外観を実装します。

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    Title="Window with button"
    Width="250" Height="100">

  <!-- Add button to window -->
  <Button Name="button">Click Me!</Button>

</Window>

具体的には、この XAML では、 Window 要素と Button 要素を使用してウィンドウとボタンを定義します。 各要素は、ウィンドウのタイトル バーテキストを指定するために、 Window 要素の Title 属性などの属性で構成されます。 実行時に、WPF はマークアップで定義されている要素と属性を WPF クラスのインスタンスに変換します。 たとえば、Window要素は、Window プロパティがTitle属性の値であるTitle クラスのインスタンスに変換されます。

次の図は、前の例で XAML によって定義されたユーザー インターフェイス (UI) を示しています。

ボタンを含むウィンドウ

XAML は XML ベースであるため、それを使用して作成する UI は、 要素ツリーと呼ばれる入れ子になった要素の階層に組み立てられます。 要素ツリーは、UI を作成および管理するための論理的で直感的な方法を提供します。

分離コード

アプリケーションの主な動作は、ユーザーの操作に応答する機能を実装することです。 たとえば、メニューまたはボタンをクリックし、応答でビジネス ロジックとデータ アクセス ロジックを呼び出します。 WPF では、この動作はマークアップに関連付けられているコードで実装されます。 この種類のコードはコードビハインドと呼ばれます。 次の例は、前の例の更新されたマークアップとコードビハインドを示しています。

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.AWindow"
    Title="Window with button"
    Width="250" Height="100">

  <!-- Add button to window -->
  <Button Name="button" Click="button_Click">Click Me!</Button>

</Window>

更新されたマークアップは、xmlns:x 名前空間を定義し、コードビハインドタイプのサポートを追加するスキーマにマッピングします。 x:Class属性は、分離コード クラスをこの特定の XAML マークアップに関連付けるために使用されます。 この属性が <Window> 要素で宣言されていることを考慮すると、分離コード クラスは Window クラスから継承する必要があります。

using System.Windows;

namespace SDKSample
{
    public partial class AWindow : Window
    {
        public AWindow()
        {
            // InitializeComponent call is required to merge the UI
            // that is defined in markup with this class, including  
            // setting properties and registering event handlers
            InitializeComponent();
        }

        void button_Click(object sender, RoutedEventArgs e)
        {
            // Show message box when button is clicked.
            MessageBox.Show("Hello, Windows Presentation Foundation!");
        }
    }
}
Namespace SDKSample

    Partial Public Class AWindow
        Inherits System.Windows.Window

        Public Sub New()

            ' InitializeComponent call is required to merge the UI
            ' that is defined in markup with this class, including  
            ' setting properties and registering event handlers
            InitializeComponent()

        End Sub

        Private Sub button_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)

            ' Show message box when button is clicked.
            MessageBox.Show("Hello, Windows Presentation Foundation!")

        End Sub

    End Class

End Namespace

InitializeComponent は、マークアップで定義されている UI を分離コード クラスとマージするために、分離コード クラスのコンストラクターから呼び出されます。 (InitializeComponent はアプリケーションのビルド時に自動的に生成されるため、手動で実装する必要はありません)。 x:ClassInitializeComponent の組み合わせにより、実装が作成されるたびに正しく初期化されます。

マークアップでは、<Button>要素がbutton_Click属性のClickの値を定義していることに注意してください。 マークアップと分離コードを初期化して連携すると、ボタンの Click イベントが自動的に button_Click メソッドにマップされます。 ボタンがクリックされると、イベント ハンドラーが呼び出され、 System.Windows.MessageBox.Show メソッドを呼び出すことによってメッセージ ボックスが表示されます。

次の図は、ボタンがクリックされたときの結果を示しています。

メッセージ ボックス

入力とコマンド

ほとんどの場合、コントロールはユーザー入力を検出して応答します。 WPF 入力システムは、ダイレクト イベントとルーティング イベントの両方を使用して、テキスト入力、フォーカス管理、マウスの配置をサポートします。

多くの場合、アプリケーションには複雑な入力要件があります。 WPF には、ユーザー入力アクションとそれらのアクションに応答するコードを分離するコマンド システムが用意されています。 コマンド システムでは、複数のソースが同じコマンド ロジックを呼び出すことができます。 たとえば、さまざまなアプリケーションで使用される一般的な編集操作 ( コピー切り取り貼り付け) を使用します。 これらの操作は、コマンドを使用して実装されている場合は、別のユーザー アクションを使用して呼び出すことができます。

コントロール

アプリケーション モデルによって提供されるユーザー エクスペリエンスは、構築されたコントロールです。 WPF では、 コントロール は、次の特性を持つ WPF クラスのカテゴリに適用される傘の用語です。

  • ウィンドウまたはページでホストされます。
  • ユーザー インターフェイスがあります。
  • いくつかの動作を実装します。

詳細については、「 コントロール」を参照してください。

関数別の WPF コントロール

組み込みの WPF コントロールを次に示します。

レイアウト

ユーザー インターフェイスを作成するときは、レイアウトを形成するために、場所とサイズによってコントロールを配置します。 レイアウトの主な要件は、ウィンドウサイズと表示設定の変更に適応することです。 このような状況でレイアウトを調整するコードを強制的に記述するのではなく、WPF は、クラス最高の拡張可能なレイアウト システムを提供します。

レイアウト システムの基礎は相対的な配置であり、ウィンドウや表示条件の変化に適応する能力が向上します。 また、レイアウト システムは、コントロール間のネゴシエーションを管理してレイアウトを決定します。 ネゴシエーションは 2 段階のプロセスです。最初に、コントロールは必要な場所とサイズを親に通知します。 次に、親はコントロールに使用できるスペースを指定します。

レイアウト システムは、基本 WPF クラスを介して子コントロールに公開されます。 グリッド、スタック、ドッキングなどの一般的なレイアウトの場合、WPF にはいくつかのレイアウト コントロールが含まれています。

  • Canvas: 子コントロールは、独自のレイアウトを提供します。

  • DockPanel: 子コントロールはパネルの端に配置されます。

  • Grid: 子コントロールは、行と列で配置されます。

  • StackPanel:子コントロールは、垂直方向または水平方向に積み上げられます。

  • VirtualizingStackPanel: 子コントロールは仮想化して、水平方向または垂直方向に整列された1つの行に配置されます。

  • WrapPanel: 子コントロールは、現在の行に十分なスペースがない場合に、左から右の順序で配置され、次の行に折り返されます。

次の例では、 DockPanel を使用して、いくつかの TextBox コントロールをレイアウトします。

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.LayoutWindow"
    Title="Layout with the DockPanel" Height="143" Width="319">

  <!--DockPanel to layout four text boxes-->
  <DockPanel>
    <TextBox DockPanel.Dock="Top">Dock = "Top"</TextBox>
    <TextBox DockPanel.Dock="Bottom">Dock = "Bottom"</TextBox>
    <TextBox DockPanel.Dock="Left">Dock = "Left"</TextBox>
    <TextBox Background="White">This TextBox "fills" the remaining space.</TextBox>
  </DockPanel>

</Window>

DockPanelを使用すると、子TextBoxコントロールに配置方法を伝えることができます。 これを行うために、 DockPanel は、子コントロールに公開される Dock 添付プロパティを実装して、それぞれのコントロールがドッキング スタイルを指定できるようにします。

子コントロールで使用するために親コントロールによって実装されるプロパティは、 添付プロパティと呼ばれる WPF コンストラクトです。

次の図は、前の例の XAML マークアップの結果を示しています。

DockPanel ページ

データ バインディング

ほとんどのアプリケーションは、データを表示および編集する手段をユーザーに提供するために作成されます。 WPF アプリケーションの場合、データの格納とアクセスの作業は、SQL や Entity Framework Core などのさまざまな .NET データ アクセス ライブラリによって既に提供されています。 データにアクセスしてアプリケーションのマネージド オブジェクトに読み込んだ後、WPF アプリケーションのハードワークが開始されます。 基本的に、これには次の 2 つのことが含まれます。

  1. マネージド オブジェクトからコントロールにデータをコピーし、そこでデータを表示および編集できます。

  2. コントロールを使用してデータに加えられた変更がマネージド オブジェクトにコピーされるようにします。

アプリケーション開発を簡略化するために、WPF には、これらの手順を自動的に処理する強力なデータ バインディング エンジンが用意されています。 データ バインディング エンジンのコア ユニットは Binding クラスであり、そのジョブはコントロール (バインディング ターゲット) をデータ オブジェクト (バインディング ソース) にバインドすることです。 この関係を次の図に示します。

基本的なデータ バインディング図

WPF では、XAML マークアップでバインドを直接宣言できます。 たとえば、次の XAML コードでは、"Text" XAML 構文を使用して、TextBoxName プロパティをオブジェクトの{Binding ... } プロパティにバインドします。 これは、DataContext プロパティを持つWindowName プロパティに設定されたデータ オブジェクトがあることを前提としています。

<Window
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     x:Class="SDKSample.DataBindingWindow">

   <!-- Bind the TextBox to the data source (TextBox.Text to Person.Name) -->
   <TextBox Name="personNameTextBox" Text="{Binding Path=Name}" />

</Window>

WPF データ バインディング エンジンは、単なるバインドだけでなく、検証、並べ替え、フィルター処理、およびグループ化を提供します。 さらに、データ バインディングでは、バインドされたデータのカスタム ユーザー インターフェイスを作成するためのデータ テンプレートの使用がサポートされています。

詳細については、「 データ バインディングの概要」を参照してください。

グラフィックスとアニメーション

WPF には、次の利点がある広範で柔軟なグラフィックス機能のセットが用意されています。

  • 解像度に依存しないグラフィックスとデバイスに依存しないグラフィックス。 WPF グラフィックス システムの基本的な測定単位は、1/96 インチのデバイスに依存しないピクセルであり、解像度に依存しないレンダリングとデバイスに依存しないレンダリングの基礎を提供します。 デバイスに依存しない各ピクセルは、レンダリングされるシステムのドット/インチ (dpi) 設定に合わせて自動的にスケーリングされます。

  • 精度が向上しました。 WPF 座標系は、単精度ではなく倍精度浮動小数点数で測定されます。 変換と不透明度の値も倍精度として表されます。 WPF では、広色域 (scRGB) もサポートされ、さまざまな色空間からの入力を管理するための統合されたサポートが提供されます。

  • 高度なグラフィックスとアニメーションのサポート。 WPF では、アニメーション シーンを管理することでグラフィックス プログラミングが簡略化されます。シーン処理、レンダリング ループ、バイリニア補間について心配する必要はありません。 さらに、WPF はヒット テストのサポートと完全なアルファ合成のサポートを提供します。

  • ハードウェア アクセラレーション。 WPF グラフィックス システムでは、グラフィックス ハードウェアを利用して CPU 使用率を最小限に抑えます。

2D グラフィックス

WPF には、四角形や楕円などの一般的なベクター描画 2D 図形のライブラリが用意されています。 図形は単なる表示用ではありません。図形には、キーボードやマウス入力など、コントロールに期待される機能の多くが実装されています。

WPF によって提供される 2D 図形は、基本的な図形の標準セットをカバーします。 ただし、カスタマイズされたユーザー インターフェイスの設計に役立つカスタム図形を作成する必要がある場合があります。 WPF には、直接描画したり、ブラシとして使用したり、他の図形やコントロールをクリップするために使用したりできるカスタム図形を作成するためのジオメトリが用意されています。

詳細については、「 ジオメトリの概要」を参照してください。

WPF 2D 機能のサブセットには、グラデーション、ビットマップ、描画、ビデオによる描画、回転、スケーリング、傾斜などの視覚効果が含まれます。 これらの効果はすべてブラシで達成されます。 次の図は、いくつかの例を示しています。

異なるブラシの図

詳細については、「 WPF ブラシの概要」を参照してください。

3D レンダリング

WPF には、より魅力的で興味深いユーザー インターフェイスを作成できるように、2D グラフィックスと統合された 3D レンダリング機能も含まれています。 たとえば、次の図は、3D 図形にレンダリングされた 2D イメージを示しています。

Visual3D サンプルスクリーン ショット

詳細については、「 3D グラフィックスの概要」を参照してください。

アニメーション

WPF アニメーションのサポートを使用すると、コントロールを拡大、シェイク、スピン、フェードして、興味深いページ切り替えを作成できます。 カスタム クラスであっても、ほとんどの WPF クラスをアニメーション化できます。 次の図は、実際の単純なアニメーションを示しています。

アニメーションキューブの画像

詳細については、「アニメーションの 概要」を参照してください。

テキストと文字体裁

高品質のテキスト レンダリングを提供するために、WPF には次の機能があります。

  • OpenType フォントのサポート。
  • ClearType の機能強化。
  • ハードウェア アクセラレーションを利用する高パフォーマンス。
  • テキストとメディア、グラフィックス、アニメーションの統合。
  • 国際フォントのサポートとフォールバック メカニズム。

グラフィックとのテキスト統合のデモとして、次の図はテキスト装飾の適用を示しています。

さまざまなテキスト装飾を含むテキスト

詳細については、「 Windows Presentation Foundation の文字体裁」を参照してください。

WPF アプリをカスタマイズする

ここまでは、アプリケーションを開発するための主要な WPF 構成要素を確認しました。

  • アプリケーション モデルを使用して、主にコントロールで構成されるアプリケーション コンテンツをホストして配信します。
  • ユーザー インターフェイスでのコントロールの配置を簡略化するには、WPF レイアウト システムを使用します。
  • データ バインディングを使用して、ユーザー インターフェイスとデータの統合作業を減らします。
  • アプリケーションの視覚的な外観を向上させるために、WPF によって提供されるグラフィックス、アニメーション、メディアサポートの包括的な範囲を使用します。

しかし、多くの場合、基本は、本当に明確で視覚的に魅力的なユーザー エクスペリエンスを作成および管理するのに十分ではありません。 標準の WPF コントロールは、アプリケーションの目的の外観と統合されない場合があります。 最も効果的な方法でデータが表示されない場合があります。 アプリケーションの全体的なユーザー エクスペリエンスは、Windows テーマの既定の外観には適していない場合があります。

このため、WPF には、独自のユーザー エクスペリエンスを作成するためのさまざまなメカニズムが用意されています。

コンテンツ モデル

ほとんどの WPF コントロールの主な目的は、コンテンツを表示するためです。 WPF では、コントロールのコンテンツを構成できる項目の種類と数は、コントロールの コンテンツ モデルと呼ばれます。 一部のコントロールには、1 つの項目とコンテンツの種類を含めることができます。 たとえば、 TextBox の内容は、 Text プロパティに割り当てられる文字列値です。

ただし、他のコントロールには、さまざまな種類のコンテンツの複数の項目を含めることができます。Button プロパティで指定されたContentの内容には、レイアウト コントロール、テキスト、画像、図形など、さまざまな項目を含めることができます。

さまざまなコントロールでサポートされるコンテンツの種類の詳細については、「 WPF コンテンツ モデル」を参照してください。

トリガー (条件や動作を引き起こすもの)

XAML マークアップの主な目的はアプリケーションの外観を実装することですが、XAML を使用してアプリケーションの動作のいくつかの側面を実装することもできます。 1 つの例として、トリガーを使用して、ユーザーの操作に基づいてアプリケーションの外観を変更します。 詳細については、「 スタイルとテンプレート」を参照してください。

テンプレート

WPF コントロールの既定のユーザー インターフェイスは、通常、他のコントロールと図形から構築されます。 たとえば、 Button は、 ButtonChrome コントロールと ContentPresenter コントロールの両方で構成されます。 ButtonChromeは標準のボタンの外観を提供し、ContentPresenterContentプロパティで指定されたボタンの内容を表示します。

コントロールの既定の外観が、アプリケーションの全体的な外観と競合する場合があります。 この場合は、 ControlTemplate を使用して、コンテンツと動作を変更せずにコントロールのユーザー インターフェイスの外観を変更できます。

たとえば、 Button では、クリックされたときに Click イベントが発生します。 ボタンのテンプレートを変更して Ellipse 図形を表示することで、コントロールの側面のビジュアルは変更されましたが、機能は変更されていません。 コントロールの視覚的な側面をクリックしても、 Click イベントは想定どおりに発生します。

楕円ボタンと 2 つ目のウィンドウ

データ テンプレート

コントロール テンプレートではコントロールの外観を指定できますが、データ テンプレートではコントロールのコンテンツの外観を指定できます。 データ テンプレートは、バインドされたデータの表示方法を強化するために頻繁に使用されます。 次の図は、ListBox オブジェクトのコレクションにバインドされているTaskの既定の外観を示しています。各タスクには名前、説明、優先順位があります。

既定の外観のリスト ボックス

既定の外観は、 ListBoxに期待される外観です。 ただし、各タスクの既定の外観には、タスク名のみが含まれます。 タスク名、説明、優先度を表示するには、 ListBox コントロールのバインドされたリストアイテムの既定の外観を、 DataTemplateを使用して変更する必要があります。 Task オブジェクト用に作成されたデータ テンプレートを適用する例を次に示します。

データ テンプレートを使用するリスト ボックス

ListBoxは動作と全体的な外観を保持し、リスト ボックスによって表示されるコンテンツの外観のみが変更されています。

詳細については、「 データ テンプレートの概要」を参照してください。

スタイル

スタイルを使用すると、開発者やデザイナーは製品の特定の外観を標準化できます。 WPF には強力なスタイル モデルが用意されており、その基礎は Style 要素です。 スタイルでは、型にプロパティ値を適用できます。 これらは、参照時に型または個々のオブジェクトに従って、すべてに自動的に適用できます。 次の例では、ウィンドウ上のすべての Button の背景色を Orangeに設定するスタイルを作成します。

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.StyleWindow"
    Title="Styles">

    <Window.Resources>
        <!-- Style that will be applied to all buttons for this window -->
        <Style TargetType="{x:Type Button}">
            <Setter Property="Background" Value="Orange" />
            <Setter Property="BorderBrush" Value="Crimson" />
            <Setter Property="FontSize" Value="20" />
            <Setter Property="FontWeight" Value="Bold" />
            <Setter Property="Margin" Value="5" />
        </Style>
    </Window.Resources>
    <StackPanel>

        <!-- This button will have the style applied to it -->
        <Button>Click Me!</Button>

        <!-- This label will not have the style applied to it -->
        <Label>Don't Click Me!</Label>

        <!-- This button will have the style applied to it -->
        <Button>Click Me!</Button>

    </StackPanel>
</Window>

このスタイルはすべての Button コントロールを対象としているため、次の図に示すように、スタイルはウィンドウ内のすべてのボタンに自動的に適用されます。

2 つのオレンジ色のボタン

詳細については、「 スタイルとテンプレート」を参照してください。

リソース

アプリケーション内のコントロールは、同じ外観を共有する必要があります。フォントや背景色から、テンプレート、データ テンプレート、スタイルを制御するものを含めることができます。 ユーザー インターフェイス リソースに対する WPF のサポートを使用して、再利用するためにこれらのリソースを 1 つの場所にカプセル化できます。

次の例では、 ButtonLabelで共有される一般的な背景色を定義します。

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.ResourcesWindow"
    Title="Resources Window">

  <!-- Define window-scoped background color resource -->
  <Window.Resources>
    <SolidColorBrush x:Key="defaultBackground" Color="Red" />
  </Window.Resources>

  <!-- Button background is defined by window-scoped resource -->
  <Button Background="{StaticResource defaultBackground}">One Button</Button>

  <!-- Label background is defined by window-scoped resource -->
  <Label Background="{StaticResource defaultBackground}">One Label</Label>
</Window>

詳細については、「 WPF リソースを定義して参照する方法」を参照してください

カスタム コントロール

WPF には多数のカスタマイズ サポートが用意されていますが、既存の WPF コントロールがアプリケーションまたはそのユーザーのニーズを満たしていない場合があります。 これは、次の場合に発生する可能性があります。

  • 必要なユーザー インターフェイスは、既存の WPF 実装の外観をカスタマイズして作成することはできません。
  • 必要な動作は、既存の WPF 実装ではサポートされていません (または簡単にはサポートされていません)。

ただし、この時点で、3 つの WPF モデルのいずれかを利用して新しいコントロールを作成できます。 各モデルは特定のシナリオを対象としており、カスタム コントロールを特定の WPF 基本クラスから派生させる必要があります。 3 つのモデルを次に示します。

  • ユーザー コントロール モデル
    カスタム コントロールは UserControl から派生し、1 つ以上の他のコントロールで構成されます。

  • コントロール モデル カスタム コントロールは Control から派生し、ほとんどの WPF コントロールと同様に、テンプレートを使用して動作と外観を分離する実装を構築するために使用されます。 Controlから派生すると、ユーザー コントロールよりもカスタム ユーザー インターフェイスを自由に作成できますが、より多くの労力が必要になる場合があります。

  • フレームワーク要素モデル
    カスタム コントロールは、その外観が (テンプレートではなく) カスタム レンダリング ロジックによって定義されている場合、 FrameworkElement から派生します。

カスタム コントロールの詳細については、「 コントロールの作成の概要」を参照してください。

こちらも参照ください