【问题标题】:Visual Studio breaks Visual InheritanceVisual Studio 打破了视觉继承
【发布时间】:2018-11-21 09:14:01
【问题描述】:

我创建了一个FormBase,从中继承了一个FomBaseList 和一个FormBaseDetail
项目中的所有其他形式均来自FormBaseListFormBaseDetail
现在看来VS在这方面有很大的问题,而我最大的问题是VS一直将Ancestor表单中的属性值从子表单写入designer.cs。

例如,在FormBaseList 我有这个属性/值:

this.gttDXGridView1.OptionsView.ShowAutoFilterRow = true;

我希望在派生形式中,例如 FormClientList,designer.cs 中没有提及此值,因为它应该从其父级获取值。换句话说,就是简单的基本 OOP。
而且我还希望当我将FormClientList 中的属性更改为

this.gttDXGridView1.OptionsView.ShowAutoFilterRow = false;

这被视为基类的覆盖。
但是,VS 会不断用 FormBaseList.Designer.cs 中的值覆盖 FormClientList.Designer.cs 中的属性。
在我看来,这违反了 OOP 的规则,例如 Delphi 等支持视觉继承的其他工具就可以做到这一点。

如何阻止 VS 这样做?
使用设计器更改属性。
所有控件都是 DevExpress 控件,或者是从 DevExpress 控件派生的。

另一个例子,它正好相反,所以很奇怪。

例如,在 BaseForm 上放置一个 Button 并给它一个图像。
带有图像的按钮出现在所有派生表单上。
现在更改 BaseForm 按钮上的图像。
您会期望图像在所有派生形式上也会发生变化,但这不会发生。
我发现VS又在所有派生的designer.cs文件中写入了按钮的属性值,这次并没有覆盖它们。

【问题讨论】:

  • VS 中没有内置机制来执行此操作。 DevExpress 是一种控件供应商,可能会在其控件设计器中包含自己的代码序列化器。你应该问他们。
  • @HansPassant 好的,我会的,至少我现在已经知道这会缩小我的搜索范围
  • 你的另一个例子 → 我无法确认。当您有一个具有基本形式的图像的按钮时,如果您更改基本形式的按钮的图像并重建项目,则派生形式的按钮将显示新的图像。 (除非您在派生形式中更改了按钮的图像。)
  • 首先,Winforms 上的Visual Inheritance 并不是很友好,如果可以避免,就避免。我知道在纸上看起来有时是个好主意,但是......我唯一避免大部分问题的建议是确保在编辑/更新基本表单时关闭所有子表单并在任何修改后构建项目再次打开孩子之前的基本形式。希望对您有所帮助。
  • @RezaAghaei VS 已经在所有派生的 Desinger.cs 文件中写入了图像的属性值,所以我猜这算作在派生形式上更改它。问题是 VS 一开始就不应该这样做

标签: winforms inheritance visual-studio-2015 devexpress devexpress-windows-ui


【解决方案1】:

我在 DevExpress 论坛上创建了一张关于此问题的票证,并且他们能够复制它。
它现在被传递给他们的开发人员。

https://www.devexpress.com/Support/Center/Question/Details/T692940/devexpress-controls-break-visual-inheritance-in-visual-studio

看来我不是第一个报告类似问题的人。

https://www.devexpress.com/Support/Center/Question/Details/T692244/imageoptions-are-serialized-in-a-successor-when-visual-inheritance-is-in-effect

【讨论】:

    猜你喜欢
    • 2011-08-13
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 2017-11-22
    • 1970-01-01
    • 2019-10-24
    • 2011-03-05
    相关资源
    最近更新 更多