问题截图如下:
我想实现的效果说明:
1、在基类中把按钮的位置放置好,避免子类重复设置按钮
2、在基类中把各个按钮的单击事件注册好,避免在子类中重复设置按钮的单击事件
3、在基类中定义每个按钮单击事件调用的抽象方法,这些抽象方法是需要子类去实现的,这样子类一继承基类就自动生成了各个需要实现的抽象方法的架构,直接将需要的代码填充到相应的方法中就可以实现相应的功能了,考虑过不用抽象方法,而是使用虚方法,但是使用虚方法继承的时候不能自动把各个需要重写的方法填充到代码区中,需要人为自己指定重写哪个方法,这样一是输入量稍微多一些,二是如果一旦重写的方法不完全就会有一些功能实现不了,也考虑过用基类继承接口的方式把方法写到接口中,但是没有找到什么办法能够做到我需要的效果,代码及界面截图如下,不知道我想要实现的效果怎么能够做到,或者说这种效果能够做到不。
我想实现的效果说明:
1、在基类中把按钮的位置放置好,避免子类重复设置按钮
2、在基类中把各个按钮的单击事件注册好,避免在子类中重复设置按钮的单击事件
3、在基类中定义每个按钮单击事件调用的抽象方法,这些抽象方法是需要子类去实现的,这样子类一继承基类就自动生成了各个需要实现的抽象方法的架构,直接将需要的代码填充到相应的方法中就可以实现相应的功能了,考虑过不用抽象方法,而是使用虚方法,但是使用虚方法继承的时候不能自动把各个需要重写的方法填充到代码区中,需要人为自己指定重写哪个方法,这样一是输入量稍微多一些,二是如果一旦重写的方法不完全就会有一些功能实现不了,也考虑过用基类继承接口的方式把方法写到接口中,但是没有找到什么办法能够做到我需要的效果,代码及界面截图如下,不知道我想要实现的效果怎么能够做到,或者说这种效果能够做到不。
2.
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类的继承
//你可以根据自己的场景,重载带参数的构造函数
public View() : base() {
//...此处忽略变量声明
object[] _args = new object[]{this};
//当前form引用被传入业务逻辑组件的构造器
ViewModel = System.Activator.CreateInstance(_assName, _className, false, 0, null, _args, null, null);
}
private Form baseForm;
public FormEdit(Form pForm){
baseForm = pForm
......
}
原因在于:设计时刻开发者不知道UI上的内容,
这完全由ViewModel和BusinessModel决定,
由ViewController在运行时刻动态渲染