关于winforms:“视觉继承”的作用是什么?

关于winforms:“视觉继承”的作用是什么?

What's the state of play with “Visual Inheritance”

我们有一个应用程序,该应用程序必须灵活地向用户显示其主要表单-根据用户的不同,表单应略有不同,可能在此处或此处有一个额外的按钮,或其他一些细微差别。 为了停止编写代码以显式删除或添加控件等,我转向视觉继承来解决问题-我认为这是一种整洁,干净且符合逻辑的OO风格-事实证明,有一半的时间继承形式很难 在没有充分理由的情况下在VS中渲染主题集-我感觉开发人员以及Microsoft在某种程度上都回避了Visual Inheritance的实践-您可以确认这一点,我在这里遗漏了什么吗?

问候。


我认为他们在2005年或多或少地解决了桌面设计师的问题。
您是否尝试过常见的罪魁祸首?

  • 没有抽象控件类型
  • 没有任何形式的构造函数参数
  • 初始化移至Form_Load而不是Ctor
  • 与放置在其中的usercontrol / form相同的项目中没有控件
  • 关闭所有文档->清理->重建
  • 重启VS

我似乎认为只要您完成了以上所有操作,它就可以正常工作。


我正在研究(肯定即将淘汰)的MCAD,并且WinForms元素的一部分是"视觉继承"。

我个人对此没有太大问题,但是,有一些注意事项需要考虑。

对我而言,主要问题始终是初始化。.您需要记住,设计人员无法/不以与运行时相同的方式实例化表单(类似地,它无法通过Web开发人员来实例化,这就是为什么需要注意使用自定义控件呈现)。

同样,一旦更改了表单,就需要对项目进行完整的重新构建,以便将对表单的更改传播到继承自该表单的子表单。

我个人没有看到任何证据表明它已被"回避"。 AFAIK,它仍然是在可能的情况下重复使用代码的良好实践。视觉继承提供了这一点。

我可以建议使用示例代码针对您遇到的实际问题创建一个新问题吗?然后,我们可以查看它是否可以运行并解释原因:)


我已经在VS2005中看到了一些问题。它们主要是由于设计器中表单对象的构造问题。尝试从表单构造函数等访问数据库的代码存在问题。

您可以通过启动Visual Studio的第二个实例并在调试器中加载第一个实例来调试此类问题。如果在代码中设置了断点,则可以调试在第一个实例中在设计器中发生的情况。

我记得的另一个问题是表单类中的泛型

1
public class MyForm<MyObject> : Form

这行不通


我想我已经找到一种避免该问题的方法。

不要将Form_Load事件挂在您的父窗体中,这会破坏设计器。

另外,不要从父窗体的Visual Studio中删除Default空构造函数。如果要使用依赖注入,请创建另一个构造函数。

像这样:

1
2
3
4
5
6
7
8
9
10
public ProductDetail()
{
    InitializeComponent();
}

public ProductDetail(ISupplierController supplierController) : base()
{
    InitializeComponent();
    this.supplierController = supplierController;
}

然后,您仍然可以从继承的Form中执行此操作:

1
2
3
4
5
public NewProduct(ISupplierController supplierController)
    : base(supplierController)
{
    InitializeComponent();
}

到目前为止,这对我有用,而且我也遇到了一些奇怪的设计师问题。

干杯,丹尼尔


我经常在Visual Studio中偶然发现这样的问题。在许多情况下,MSVS表单设计器无法正确呈现表单。在使用WinForms的日子里,我不得不做各种怪异的技巧来启用一些复杂的方案。但是,我认为使用可视继承非常有益,并且无论MSVS设计器的错误如何,都不应丢弃。


阅读此:http://cs.rthand.com/blogs/blog_with_righthand/archive/2005/11/10/186.aspx

AFAIK仍然存在可视继承问题,并且对象依赖于设计元素的集合,通常是网格控件等。我相信MS仍然消除了更改f.ex的可能性。继承了表单/用户控件等的GridView。但是其他控件(如TextBox,Form,UserControl,Panel等)应该可以正常工作。

到目前为止,我自己使用第三方网格控件对VI都没有问题,但是您必须特别小心,必须避免从集合中删除项目。


推荐阅读

    linux看用户信息命令?

    linux看用户信息命令?,系统,密码,信息,状态,软件,情况,命令,用户,网络,时间,l

    linux下删除用户命令?

    linux下删除用户命令?,系统,代码,邮箱,用户组,命令,用户,名称,管理,电脑,账

    用户id的linux命令?

    用户id的linux命令?,系统,密码,信息,联系方式,地址,位置,用户,命令,用户名,

    linuxid命令作用?

    linuxid命令作用?,系统,工作,命令,信息,标准,代码,数据,名称,概念,用户,linux

    linux的fd命令作用?

    linux的fd命令作用?,管理,工作,信息,系统,软件,服务,有限,标准,电脑,设备,【f

    linux删除用户组命令?

    linux删除用户组命令?,管理,系统,密码,电脑,名称,用户,用户组,名字,信息,工

    linuxcd命令作用?

    linuxcd命令作用?,工作,系统,命令,密码,信息,目录,用户,终端,作用,缩写,linux

    linux下用户权限命令?

    linux下用户权限命令?,管理,系统,密码,地址,权限,时间,基础,信息,基本知识,

    linux登陆用户命令?

    linux登陆用户命令?,系统,工具,信息,地址,软件,工作,命令,数字,服务,名称,Lin

    linux用户名改名命令?

    linux用户名改名命令?,系统,密码,命令,代码,名称,用户名,用户,终端,主机名,

    linux基础命令和作用?

    linux基础命令和作用?,基础,系统,单位,电脑,权威,管理,网络,设备,命令,音乐,

    linux用户分组命令?

    linux用户分组命令?,系统,命令,电脑,信息,时间,标准,资料,用户,文件,用户组,L

    linux命令改用户所属?

    linux命令改用户所属?,系统,文件,名称,用户组,命令,用户,名录,基本知识,所

    linux系统用户组命令?

    linux系统用户组命令?,系统,管理,密码,代码,用户组,用户,命令,邮箱,电脑,名

    linux用户管理的命令?

    linux用户管理的命令?,系统,管理,信息,地址,工作,用户,单位,基础,数据,命令,L

    linux用户退出命令行?

    linux用户退出命令行?,状态,档案,标准,系统,命令,文件,模式,编辑,指令,主机,l

    linux用户自定义命令?

    linux用户自定义命令?,系统,时间,标准,软件,项目,电脑,服务,工具,基本知识,

    linux用户组命令设置?

    linux用户组命令设置?,管理,系统,密码,代码,电脑,用户组,用户,软件,新增,命

    linux进入用户命令行?

    linux进入用户命令行?,系统,地址,工作,服务,信息,命令,首页,电脑,密码,终端,L

    linux用户用不了命令?

    linux用户用不了命令?,系统,档案,不了,命令,网络,密码,信息,情况,用户,权限,l