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

设计师讨厌(即不支持)通用控件,而且这不会很快改变,所以不要那样做。相反,考虑拥有一个接受 a 的属性(或类似的)Type,并在运行时做一些工作(反射等) - 或者:不要使用设计器。

例如,如果您有:

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

您可以使用:

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

这将为您提供您当前拥有的一切(new,IElement等) - 但它无法在编译时进行任何验证。

于 2009-12-17T08:54:42.840 回答
11

在这种情况下,有时最简单的做法是创建一个限定泛型参数的空子类。

这通常通过 ObservableCollection 完成:

public class SomeItemCollection : ObservableCollection<SomeItem>{

}

这有点烦人,但它可以解决你的问题。

于 2009-12-17T08:58:51.533 回答
3

就像其他人所说的那样,Visual Studio 设计器在处理控件中的泛型时遇到了很多麻烦。在尝试实现通用“属性查看器”类之类的东西时,我自己也遇到了这个问题。

对我有用的解决方案是定义一个中间类,就像 Egor 说的那样。如果我正确理解您的问题,对于您的情况,应该是这样的:

public class PictureElementGallery : Gallery<PictureElement>

然后在您的表单上使用PictureElementGallery ,而不是Gallery < PictureElement >。设计师应该没有问题。

于 2009-12-17T09:54:43.540 回答
1

让控件与独立于控件本身的泛型类交互,而不是使用泛型控件。然后将这个类传递给控件。

于 2009-12-17T09:06:09.163 回答