7

から派生したカスタムクラスがありますUserControl。コード:

public partial class Gallery<T> : UserControl where T : class, IElement, new()

このクラスは、機能するはずのように機能します。しかし、これらのGalleryクラスを含むフォームのデザインモードに入ろうとすると、エラーが発生します。

  • タイプ'PresentrBuilder.Forms.Gallery'が見つかりませんでした。このタイプを含むアセンブリが参照されていることを確認してください。このタイプが開発プロジェクトの一部である場合は、プロジェクトが正常にビルドされていることを確認してください。

  • 変数'pictureGallery'は宣言されていないか、割り当てられていません。

注:(pictureGallery実際にはGallery<PictureElement>)です。

どうすればこれを解決できますか?このように、デザインモードで作業することができず、ユーザーインターフェイスの作成が非常に困難になります。

4

4 に答える 4

12

設計者は一般的なコントロールを嫌います(つまり、サポートしていません)。それはすぐには変更されないので、そうしないでください。代わりに、を受け入れるプロパティ(または同様のもの)を用意しType、実行時にいくつかの作業(リフレクションなど)を行うことを検討してください。または、デザイナーを使用しないでください。

たとえば、次の場合:

public Type ControlType {get;set;} // comparable to T in the original

次を使用できます。

IElement el = (IElement) Activator.CreateInstance(ControlType);

これにより、現在持っているすべてのもの(newIElementなど)が得られますが、コンパイル時に検証を行うことはできません。

于 2009-12-17T08:54:42.840 に答える
11

この場合、最も簡単な方法は、ジェネリックパラメーターを修飾する空のサブクラスを作成することです。

これは多くの場合、ObservableCollectionで行われます。

public class SomeItemCollection : ObservableCollection<SomeItem>{

}

ちょっとイライラしますが、問題は解決するかもしれません。

于 2009-12-17T08:58:51.533 に答える
3

他の人が述べているように、VisualStudioDesignerはコントロールでジェネリックを処理するのに多くの問題を抱えています。一般的な「プロパティビューア」クラスのようなものを実装しようとしたときに、私はこれに遭遇しました。

私のために働いた解決策は、エゴールが言ったように、中間クラスを定義することでした。私があなたの質問を正しく理解していれば、あなたの状況では、それは次のようになるはずです:

public class PictureElementGallery : Gallery<PictureElement>

次に、 Gallery <PictureElement>の代わりに、フォームでPictureElementGalleryを使用します。設計者はそれで問題がないはずです。

于 2009-12-17T09:54:43.540 に答える
1

ジェネリックコントロールを使用する代わりに、コントロール自体とは別のジェネリッククラスとコントロールを相互作用させます。次に、このクラスをコントロールに渡します。

于 2009-12-17T09:06:09.163 に答える