[解決済み] ユーザーコントロールライブラリーとカスタムコントロールライブラリーの違いは何ですか?
質問
私はWPFを使い始めたばかりで、再利用可能なWPFコントロールを作りたいと考えています。
Visual Studio でプロジェクトを作成するためのオプションを見ると、"WPF User Control Library" と "WPF Custom Control Library" が表示されます。 この2つの違いは何なのか不明で、Googleで検索してもまともな説明は出てきません。
両者の違いを理解し、理想的にはどちらを使うべきかの例を見たいと思います。
どのように解決するのですか?
実際には、カスタムコントロールはコードレベルで実装するもので、ユーザーコントロールにはXAMLを使用することができます。カスタムコントロールは、WPFコントロールのベースクラスの1つを拡張し、コードによって追加機能を提供するため、追加されたロジックと表現はすべてコード内に実装する必要があります。
ユーザーコントロールは、技術的には通常のコンテンツコントロールで、コードの一部で拡張することができますが、通常はその中に他のコントロールを配置することで拡張します。つまり、Kentが言ったように、UserControlは他のコントロールの集合体なのです。そのため、ユーザーコントロールでできることはかなり制限されます。使い勝手は良いのですが、フルカスタムコントロールに比べると限界があります。
これらのコントロールは、ランタイムの観点から見ると、ちょっとした違いがあります。アプリケーションをビルドして、そこにUserControlを配置すると、コントロールツリーは、その中に具象UserControlテンプレートを持つことになります。そこで、特化したボタンといういい加減な例を考えてみると。もし、ユーザーコントロールを使うなら、その中にボタンを追加して
<UserControl>
要素を使用します。カスタムコントロールを使用する場合は、おそらくボタンからコントロール自体を派生させることになるでしょう。この違いは、論理ツリーで確認できます。
カスタムコントロールは、以下のような論理ツリーを提供します。
-
ウィンドウ
- カスタムボタン
UserControlは、次のような論理ツリーを与える。
-
ウィンドウ
-
CustomButtonUserControl
- ボタン
-
CustomButtonUserControl
つまり、UserControlは通常のContentControlであり、それを少し拡張して、コンテンツをあらかじめ定義することができるのです。カスタムコントロールは、XAMLの利点を持つ代わりに、すべてのロジックとインタラクションをコードで行う必要があるため、実装の容易さの代償として、より大きな柔軟性を提供します。
とはいえ、ここまで書いておいてなんですが、Visual Studioのテンプレートにそれほど大きな違いがあるとは思えませんね。おそらく、Visual Studio Custom Controlは空のカスタムコントロールのプロジェクトを作成するだけで、User Controlプロジェクトは空のユーザーコントロールのプロジェクトを作成するのでしょう。そのプロジェクトに後から任意の項目を追加することができます。
更新情報
カスタムコントロールとユーザーコントロールの使い分けについて、私の意見を述べますと、もしユーザーコントロールで何かを成し遂げることができ、論理ツリーに余分なコントロール要素があっても問題ないのであれば、ユーザーコントロールを使う方が作成も維持も簡単です。カスタム・コントロールは、ユーザー・コントロールを使用しない理由がある場合にのみ使用してください。
関連
-
WPFバインディング(データバインディング)の使用方法
-
[解決済み] WPFの場合、x:Name属性とName属性の違いは何ですか?
-
[解決済み] WPFのStaticResourceとDynamicResourceの違いは何ですか?
-
[解決済み] StackPanelの子パネルが下方向に最大限のスペースを埋めるようにするには?
-
[解決済み] SelectedItem、SelectedValue、SelectedValuePathの違いについて
-
[解決済み] Windows 8 ランタイム(WinRT / Windowsストアアプリ / Windows 10 ユニバーサルアプリ)とSilverlightやWPFの比較はどうですか?[クローズド]
-
[解決済み】Visibility.CollapsedとVisibility.Hiddenの違いについて
-
[解決済み】Visual Studio 2015の追加デバッグオプションの無効化
-
[解決済み] [Solved] StackPanelの子要素をスペースアウトさせるには?
-
[解決済み] XAMLで複数のバリューコンバータを連結する方法はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
WPFバインディング(データバインディング)の使用方法
-
[解決済み] WPFのテキストラップとWrapWithOverflowの比較
-
[解決済み] WPF TemplateBindingとRelativeSource TemplatedParentの比較
-
[解決済み] スタックパネルでアイテムを整列させる?
-
[解決済み] Generic.xamlの特徴とは?
-
[解決済み] WPF Numeric UpDownコントロールはどこにありますか?
-
[解決済み] ItemsControlの仮想化?
-
[解決済み] レンダリング時間やパフォーマンスの面で最も効率的なパネルはどのような順番になりますか?
-
[解決済み] 読み取り専用のGUIプロパティをViewModelにプッシュバックする
-
[解決済み] ViewModelLocatorとは何ですか?また、DataTemplatesと比較した場合の長所と短所は何ですか?