2009-07-15 34 views
37

対私は最近、とにかく...WPFのControlTemplateは、UserControlの

を私は上のカスタム依存関係プロパティと協力しなければならなかったので、かなり長い時間がかかりましたユーザーコントロールを作った、それはちょうど束でした3つのコントロール:テキストボックス、階層ツリーのポップアップ

今私はおそらくContentTemplateと書くことができることに気付きました。したがって、ユーザコントロールを使用する利点は何ですか?

答えて

54

ここで考慮する必要があるのは、UserControl、ControlTemplate、およびのカスタムコントロールです。 (私はDataTemplateが説明を必要としないと推測しています)

カスタムコントロールは、新しいUIコンポーネントの基本機能を作成するときに提供するものです。これにはさまざまな賛否両論がありますが、たとえば、ItemsControlのカスタム選択動作が必要な場合は、SelectorまたはMultiSelectorをサブクラス化することで可能です(wpftoolkit DataGridがこれを行います)。また、新しいDependencyPropertyを含むオブジェクトが必要な場合は、ほとんどの場合Controlから派生します。

ここに含まれるwpfの原則は、「見た目のない」コントロールパラダイムです。「誰かがあなたのコントロールのテンプレートを作成することを期待してください。あるいは、少なくとも自分のテンプレートシナリオでうまく動作するようにしてください。カスタムコントロールは、通常、フレームワークDLLの一部として、再利用性を念頭に置いて作成されます。

ControlTemplateは、基本的に置換ビジュアルツリーの説明であり、FrameworkElementsに明示的に設定することも、スタイルの一部として設定することもできます。これは、あなたの目標が主にアプリケーションを作成してそれを実行することを目指すときに目指すべきオプションです。バインディングとトリガー(そしてスタイル自体を含む可能性がある)を取得できる場合は、ControlTemplateで視覚的にほとんど何でも行うことができます。これらのすべては、アプリケーションに共通の "テーマ"を与えるために、再利用されるリソースとして宣言することができます。

UserControlは、独立したコンポジットコントロールであり、デザイナで個別に編集可能な部分があり、コンポーネントを表示してデザイナで管理する必要がある場合に最適です。一方、ControlTemplateはデザイナでの操作のためにそのコンポーネントを公開しません(可視になりますが)。通常は、顧客の詳細ページ、製品の表示ブラウザ、または本格的なコントロールを作成したくない場合は完全なデザイナーのサポートで詳細な表示が必要な場合は、UserControlを作成します。

MVVMパターンを使用すると、特別な場合があります。多くの優れたMVVMの実装では、ViewとしてUserControlを使用し、これらのビューで使用されるリソースとしてControlTemplatesおよびStylesを使用します。 MVVMの習慣はカスタムコントロールの必要性を最小限に抑え、他にも多くの利点があります。 (他の多くの間MVVMの詳細については、ジョシュ・スミス、サシャ理容室とカールShifflettの素晴らしい記事のためのGoogleの)

3

独自の依存プロパティを追加する場合は、独自のクラスを定義する必要があります。

テンプレートにクラスを適用する場合、このカスタムクラスはControlUserControlのように)から派生する必要があります。

独自のControl由来のクラスを作成する主な利点は、アプリ内のあなたや他のタイプのユーザーによって、他の使用シナリオ用にテンプレートを再定義できることです。

UserControlクラスを使用する際のオーバーヘッドはごくわずかです。実際、Reflector.NETで見ると、ほとんどコードがないことがわかります。主に、UserControlは、単にいくつかの既存の依存関係プロパティのメタデータを再定義し(例えばFocusablePropertyfalseのデフォルト値を作るように。)

すぐコントロールのテンプレートを再定義する必要がある場合を除き、あなたは今のUserControlとしてそれを残すことができますし、必要に応じて後で変更してください。

+0

私は、主な違いは、私はその制御のための新しい依存関係プロパティを提供することができることがあるということを理解しています。しかし、私は他のすべての変更がスタイル、トリガ、またはテンプレートに設定できると思います。または? –

関連する問題