110,533
社区成员
发帖
与我相关
我的任务
分享
using System.ComponentModel;
//我这里form1表示你的原始抽象类,Form4VS表示相同实现的非抽象版本
// 基本含义就是利用TypeDescriptionProvider提供去欺骗vs,让vs在加载form1的时候去使用那个非抽象版本
public class AbstractCommunicatorProvider : TypeDescriptionProvider
{
public AbstractCommunicatorProvider()
: base(TypeDescriptor.GetProvider(typeof(Form1)))
{
}
public override Type GetReflectionType(Type objectType, object instance)
{
if (objectType == typeof(Form1))
objectType = typeof(Form4VS);
return base.GetReflectionType(objectType, instance);
}
public override object CreateInstance(IServiceProvider provider, Type objectType, Type[] argTypes, object[] args)
{
if (objectType == typeof(Form1))
objectType = typeof(Form4VS);
return base.CreateInstance(provider, typeof(Form4VS), argTypes, args);
}
}
3:在抽象版本的类上加注特性
[TypeDescriptionProvider(typeof(AbstractCommunicatorProvider))]
public abstract partial class Form1 : Form
这样基本可以解决vs设计器不能加载界面的毛病,注意我自己测试的结果比较有古怪,vs2010 net3.5 环境编译后并不能立刻就显示UI,我得把vs关闭后重新打开才能看到效果。
另外:我也测试了一下vs2012并不需要做上面的处理,他本身就支持抽象UI类的继承