通用表单和VS设计器

时间:2012-04-18 08:05:28

标签: c# winforms

我有一个基类

internal partial class View<T> : UserControl
  where T : class
{
    protected T t;
}

我想从View

派生一个孩子
internal partial class ViewChild<T> : View<T>
  where T : class
{
}

它运行正常,但我无法在VS设计器中编辑ViewChild。我知道问题是通用基类。但是我不明白在这种情况下我怎么能避免这种情况。 有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:3)

还有另一种方法,它不依赖于编译器标志:

http://wonkitect.wordpress.com/2008/06/20/using-visual-studio-whidbey-to-design-abstract-forms/

我真的不建议使用条件编译。使用框架更好,而不是反对它。

基本上,您可以通过现有框架为VS提供不同的类。您使用TypeDescriptionProvider属性装饰您的基类,该属性告诉VS使用不同的类作为设计器。

正如原始博客文章中所提到的,可能存在与此变通方法相关的警告,但我在一个带有&gt;的项目上得到了整齐的工作。 25 UserControls继承自公共基类。

答案 1 :(得分:2)

泛型破坏了设计器,因为它无法在没有类型T的情况下实例化该类。我在博文中解释了一个解决方法:

http://adamhouldsworth.blogspot.co.uk/2010/02/winforms-visual-inheritance-limitations.html

简而言之,您需要使用中间类“解析”类型:

  • BaseControl<T> : UserControl
  • CustomerControl_Design : BaseControl<Customer>
  • CustomerControl : CustomerControl_Design

然后,您可以根据DEBUGRELEASE编译器开关有条件地将此类切换出代码:

#if DEBUG

namespace MyNamespace
{
    using System;


    public partial class CustomerEditorControl_Design : BaseEditorControl<Customer>
    {
        public CustomerEditorControl_Design()
            : base()
        {
            InitializeComponent();
        }
    }
}

#endif

    public partial class CustomerEditorControl
#if DEBUG
        : CustomerEditorControl_Design
#else
        : BaseEditorControl<Customer>
#endif
    {
    }

这将允许您打开CustomerControl的派生类,遗憾的是, 从不 能够在签名中设计带有泛型的UI控件。我的解决方案只是启用派生项的设计。

我不知道为什么CustomerControl : BaseControl<Customer>不起作用,因为在这种情况下定义了T类型,但它根本没有 - 我猜是因为通用用法的规则。

为了他们的辩护,微软确实说这不受支持。