WPF ControlTemplate と UserControl の比較
-
16-09-2019 - |
質問
最近作ったのは、 ユーザーコントロール, 、カスタムの依存関係プロパティなどを操作する必要があったため、かなり時間がかかりました...
とにかく、それは単なる 3 つのコントロールの束でした。テキストボックス、階層ツリー付きポップアップ。
今、私はおそらく次のことを書くことができることに気づきました コントロールテンプレート のみ。したがって、 UserControl を使用する利点?
解決
ここで考慮すべきケースは 3 つあります。UserControl、ControlTemplate、および カスタム コントロール。(DataTemplate については説明の必要はないと思います)
あ カスタムコントロール 新しい UI コンポーネントの基本機能を作成するときに提供するものです。これにはさまざまな長所と短所がありますが、たとえば、ItemsControl のカスタム選択動作が必要な場合は、Selector または MultiSelector をサブクラス化することでこれを行うのが最善です (wpftoolkit DataGrid がこれを行います)。また、新しいDependencyPropertyを含むオブジェクトが必要な場合は、ほとんどの場合Controlから派生します。
ここに含まれる wpf 原則は、「見た目のない」コントロール パラダイム、つまり「誰かがコントロールをテンプレート化することを必ず期待するか、少なくとも独自のテンプレート シナリオで適切に動作するようにする」です。カスタム コントロールは通常、再利用性を念頭に置いて作成され、フレームワーク DLL の一部として作成されます。
あ コントロールテンプレート これは本質的に、置換ビジュアル ツリーの記述であり、FrameworkElements で明示的に設定することも、Style の一部として設定することもできます。これは、アプリケーションを作成して完了することが主な目的である場合に目指すべきオプションです。バインディングとトリガー (およびスタイル自体を含む可能性もあります) を正しく取得できれば、ControlTemplate を使用してほとんどすべてのことを視覚的に行うことができます。これらすべてをリソースとして宣言して再利用し、アプリケーションに共通の「テーマ」を与えることができます。
あ ユーザーコントロール は、デザイナーで個別に編集可能なパーツを備えた自己完結型の複合コントロールであり、デザイナーでコンポーネントを表示して管理する必要がある場合に最適です。一方、ControlTemplate は、そのコンポーネントをデザイナーで操作できるように公開しません (ただし、表示されます)。通常は、顧客詳細ページ、製品表示ブラウザー、または本格的なコントロールを作成したくないが、完全なデザイナー サポートによる詳細ビューが必要な場合に、UserControl を作成します。
ここでの特殊なケースは、 MVVM パターン。優れた MVVM 実装の多くは、UserControl をビューとして使用し、ControlTemplate と Style をそれらのビューで使用されるリソースとして使用します。MVVM を実践すると、カスタム コントロールの必要性も最小限に抑えられ、他にも多くの利点があります。
(特に MVVM の詳細については、Google で Josh Smith、Sacha Barber、Karl Shifflett の素晴らしい記事を参照してください)
他のヒント
独自の依存関係プロパティを追加する場合は、それらを定義するための独自のクラスが必要になります。
クラスにテンプレートを適用したい場合、このカスタム クラスは以下から派生する必要があります。 Control
(として UserControl
します)。
自分で書くことの主な利点 Control
-派生クラスは、アプリ内で、またはそのタイプの他のユーザーによって、他の使用シナリオに合わせてテンプレートを再定義できることです。
を使用する際のオーバーヘッドはほとんどありません。 UserControl
クラス。実際、Reflector.NET でこれを見ると、コードがほとんどないことがわかります。主に、 UserControl
一部の既存の依存関係プロパティのメタデータを再定義するだけです (デフォルト値を FocusableProperty
false
.)
コントロールのテンプレートをすぐに再定義する必要がない限り、そのままにしておくことができます。 UserControl
現時点では、必要に応じて後で変更します。