web-dev-qa-db-ja.com

カスタムコントロールとユーザーコントロール

ユーザーコントロールとカスタムコントロールの違いについての説明をいくつか読んでいます。たとえば、次のとおりです。 http://www.wpftutorial.net/CustomVsUserControl.html

たとえば、データグリッドのアイテムの値を変更する2つのコンボボックスを持つデータグリッドの単純な構成を作成します。私は何度も使用するので、このための特定のコントロールを作成したいと思います。ロジックを実装し、xaml呼び出しでitemsSourceを指定するだけです。

この例では、ユーザーコントロールまたはカスタムコントロールを作成する必要がありますか?プロパティとロジックがあるので、このコントロールのビューモデルが必要ですか?

編集:これら2つのオプションの概念が明確に分かれている記事をご存知ですか?

47
Louro

選択は、ユーザーコントロールとカスタムコントロールの間だけでなく、ユーザーコントロール、カスタムコントロール、コントロールテンプレートのカスタマイズ、データテンプレートのカスタマイズ、ヘッダーテンプレート(コレクションベースのコントロール用)、添付プロパティの中から選択できます。 コントロールオーサリングの概要 を参照してください

次の考慮順で行きます

  1. 添付プロパティ:機能を実現できる場合、添付プロパティを使用します。例、数値テキストボックス。

  2. コントロールテンプレート:コントロールテンプレートをカスタマイズして要件を満たすことができる場合、これを使用します。例、円形の進行状況バー。

  3. カスタムコントロール:コントロールテンプレートでできない場合は、カスタムコントロールを使用します。既に存在するコントロールをカスタマイズ/拡張する必要がある場合。 GridViewのヘッダー行に基づいた並べ替え、フィルタリングを提供する例(GridViewはMetroアプリに存在し、例を示すためだけに使用されます)

  4. ユーザーコントロール:優先度が最も低いもの。構成が必要な場合のみ、カスタムコントロールを使用して構成できません。あなたの例のように、2つのコンボボックスと1つのデータグリッド。ユーザーコントロールは、カスタムコントロールまたはコントロールテンプレートを介して利用できるシームレスなルックレス機能を提供しません。

81
Tilak

違いを説明する素晴らしい回答がすでにいくつかありますが、カスタムコントロールとUserControlsには異なる目的があることも理解しています。

UserControlは、通常、ある種の複合動作をカプセル化します。たとえば、連絡先の詳細を多くの場所で編集する必要があるアプリケーションがある場合、関連するコードを含む送信ボタンでレイアウトされたすべてのデータのラベルとテキストフィールドを持つカスタムコントロールを作成し、このコントロールを再利用できますアプリケーション全体。

カスタムコントロールは、WPFコントロールクラス(E.G. ControlContentControlなど)の1つから派生したコントロールであり、コードで作成する必要があります。これらのコントロールは、全体として一緒に行動するのではなく、通常、単一のまとまりのある目的(TextBoxComboBoxLabelを考える)を持っています(そうである必要はありませんが) 。

UserControlは、視覚的に設計できるため、通常WPFに不慣れな人にとっては簡単です。

私の提案は、UserControlから始めることです。 WPFの動作方法に慣れてきたら、いつでもこれをカスタムコントロールにリファクタリングできます。カスタムコントロールとしてコントロールを作成するには、独自のコントロールを提供する必要があるため、ControlTemplatesおよびStylesの知識が必要ですコントロールのルックアンドフィールを定義します。

すべてを言って完了したら、コントロールが正しく動作する限り、どのアプローチを使用しても問題ありません。

同じ問題に対する2つのアプローチの例については、 this postを参照してください。投稿者は、プライマリコンテンツの前にモーダルコンテンツを表示できるコントロールが必要でした。投稿者は、実際にUserControlとして実装することで自分の質問に答えました。コントロールをカスタムコントロールとして作成する回答を投稿に追加しましたが、どちらも同じ結果になります。

39
Benjamin Gale

最良の説明は msdn にあります。 CustomControlは「仮想」名であり、WPFには「CustomControl」というクラスはありません。代わりに、ControlItemsControlなどのWPFコントロールクラスの1つの上に新しいクラスを作成します。 TextBoxButtonなどのより具体的なコントロール。

特定のケースでは、UserControlで十分です。CustomControlの作成は簡単に回避できます。悪いことではありませんが、多くの人々、特にWinFormsから来たWPFの初心者は、必要以上にサブクラス化する傾向があります。

7
dowhilefor
  • view-modelがあるで、そのビューを作成したい場合はser-Controlを使用します。

  • 特定のビューモデルを持たない自律コントロールが必要な場合、
    おそらくcustom-controlが必要です。

  • 他のコントロールで全体として必要な機能、すでに存在するが見つかった場合、既存のコントロールテンプレートをオーバーライドする必要があります。
    (つまり、ひし形のボタンの場合-ボタンコントロールテンプレートをオーバーライドする必要があります。)

  • 添付プロパティと添付ビヘイビアに関しては、より多くのプロパティで拡張したいコントロールがある場合、またはデフォルトの動作とは少し異なる動作をする場合に便利です。

OPが記述されている構成の提供されたケースでは、ユーザーコントロールまたはカスタムコントロールのいずれかで実現できます。特定のビューモデルが提供されておらず、「入力」はアイテムコレクションにバインドされたプロパティにすぎないため、カスタムコントロールを好むでしょう。

ああ、そして、少し遅れてすみません。

6
G.Y

CustomControlを視覚的に簡単に設計できます。新しいUserControl(またはWindow)を作成します。 Designerでxaml構造を視覚的に作成します。新しいControlTemplateCustomControl内に結果のxamlの本文をコピーして貼り付けます(たとえば、一般的なテーマファイル)。

私の記憶が正しければ、Blendで直接CustomControlテンプレートを視覚的に設計することもできます。

もちろん、wip CustomControlをWindowにインスタンス化し、VisualStudioでコントロールのxamlビューの上に新しいパネルとしてWindowのDesignerビューを配置することもできます。スタイルテンプレートからの一部のxamlバインディングは、再構築するまでDesignerに表示されません。

[Imho GUIは主に視覚的な問題であり、コードで作成するべきではなく、作成する必要はありません。 ]

1
Riva

これが何らかの形でコントロールを初めて構築する場合、VSを使用するとインターフェイスをより簡単に設計できるため、UserControlをお勧めします。カスタムコントロールはより強力ですが、インターフェイスからコントロールのロジックを明確に分離する必要があり、これにはもう少し準備が必要です。

1
NestorArturo