关于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都没有问题,但是您必须特别小心,必须避免从集合中删除项目。


推荐阅读