私は一般的な考えを持っており、いくつかの明白なケースがありますが、私にとっていくつかの灰色の領域もあります-コンポーネントから拡張するために使用するのが最適なのはいつですか、ユーザーコントロールを作成するのが最適なのはいつですか?これは、私が解決しようとしている特定の作業問題に関係しますが、その詳細は重要ではありません。この質問に対する一般的な回答で十分です。
WPFとWindowsフォームの両方で、主な違いは、UserControlがコントロールのコレクション(複数のコントロール自体から「構成」された再利用可能な単一のオブジェクト)であることを意図していることです。
小さなコントロールで構成される「コントロール」を作成する代わりに、新しい動作で単一のプリミティブコントロールを作成する場合は、UserControlではなくComponent/CustomControl/Controlを使用する必要があります。コンポーネントは通常、非視覚的な動作であり、CustomControl/Controlは通常視覚的なコントロール用です。
コンポーネントとコントロールの間には1つの重要な違いがあります。コントロールにはユーザーインターフェイスがあります。すべてのコントロールもコンポーネントですが、すべてのコンポーネントがコントロールであるとは限りません。ユーザーインターフェイスを表示する必要がある場合は、通常、何らかのコントロールベース(Control、UserControl、Formなど)から派生したものが必要になります。 BackgroundWorkerコンポーネントなどの動作がある場合は、Componentから直接派生するだけで済みます。
別の注意...コンポーネントとコントロールの両方をデザインサーフェスにドロップできます。コンポーネントは特別な領域にアイコンとラベルとして表示され、コントロールはデザイン画面に直接表示されます。ただし、使用できる3つ目のものがあります。それは単純なクラスです。デザインサーフェスのサポートが必要ない場合は、ComponentやControlではなく単純なクラスを使用することをお勧めします。設計時のサポートがなく、100%純粋な動作が必要な場合は、軽量で肥大化が少なくなります。
一般に、コントロールにユーザーインターフェイスがない場合(または少なくともフォームに存在するユーザーインターフェイスがない場合)は、Component
を使用します。 UIコントロールの場合は、代わりにUser Control
を作成します。
私は通常、いくつかのUI機能をパッケージ化する場合にのみ、Control、またはより多くの場合UserControlを拡張します。コンポーネントについては、古典的な例であるタイマーについて考えます。デザイナにドロップし、[プロパティ]ペインから構成して、コードビハインドからプログラムでアクセスできます。つまり、UIのないオブジェクトである、バンドルされた状態と動作をデザイナーを介して操作できるようにする場合は、Componentを拡張します。