【问题标题】:Winforms designer misbehaving, essentially brokenWinforms设计师行为不端,本质上是坏的
【发布时间】:2015-02-20 15:30:47
【问题描述】:

我们在 Winforms 中内置了一个复杂的遗留表单,它最近开始出现严重的行为不端,并且随着时间的推移变得越来越糟糕。仅在设计视图中打开表单会改变表单的布局,有时会以较小的方式(将控件的大小调整为小一个像素),有时会以较大的方式(将组件移动到 X 位置) -6582)。由于此表单的大小和生成的 .Designer.cs 引用差异的性质,通常几乎无法确定对表单所做的更改是否是您实际想要的更改。

根据我在其他问题中找到的一些建议:

AutoScaleMode 设置为 None。我简单地尝试了各种显示器分辨率,但无济于事。最终我们决定不再依赖锚点,而是使用TableLayoutPanels 和 Dock 属性的组合。这就是麻烦真正开始的时候......

在重新设计此表单上的一个毛茸茸的选项卡后,当我尝试保存 Visual Studio 2-3 分钟并报告“无法加载文件或组装 'MyProject, Verion=X.X.X.X, Culture=neutral, PublicKeyToken= null' 或其依赖项之一。系统找不到指定的文件”(如下所示:Visual Studio 2013 Can't save, build, or rebuild solution)。每当表单尝试保存时,都会发生这种情况。遵循已接受答案中的建议后,我能够再次保存/构建。

尝试稍后运行会导致构建时间非常长并且表单完全为空(如下所示:All controls on a form are invisible 和 https://stackoverflow.com/a/5524183/1015495)。 所有对 Controls.Add 的调用已从设计器中删除(我认为这种巨大的变化是导致构建时间长的原因)。我将表单恢复到以前的版本并开始重新创建我的更改。 现在,更阴险的是,某些控件已将其所有 子控件删除。

在这种形式下工作充其量只是浪费时间,最坏的情况是不可行。我在网上找到的解决方案基本上可以归结为“手动重新创建表单”或“不要使用 Winforms”。不幸的是,这些都不是现在的选择。在我们能够提出适当的解决方案之前,我们如何才能减轻我们在中期未来使用此表格时遇到的问题?

【问题讨论】:

  • 您是否使用任何第三方控件?其中一个可能没有与设计师正确交互。此外,您是否考虑过将表单拆分为单独的 UserControl 以划分复杂性?如果不出意外,这将减少在需要时重建事物所需的时间。更好的是,如果其中一个 UserControl 开始出现异常行为,那么您将把问题范围缩小到一组较小的控件(希望这些控件更易于分析)。
  • 我不知道任何第 3 方控件,并且快速扫描文档大纲没有显示任何内容。我们确实有一些 用户控件在使用中(还不够,但你有它)。实际上将其分解为更多用户控件与重新创建整个事物一样糟糕,但可能会分块进行。最终我们只想摆脱 Winforms。
  • 您可以尝试启动 VS 的第二个实例,然后附加到正在运行的实例,并在抛出异常时让它在调试器中中断(适用于所有异常类型)。这可能会捕获不能很好地处理设计时的代码。
  • 表单上有子类控件吗?有些错误只是在一段时间后才会出现..
  • @TaW 澄清一下,您的意思是 具有 子类的控件?不是是子类的控件吗?

标签: c# winforms visual-studio-2012 windows-forms-designer


【解决方案1】:

我目前正在解决一个几乎相同的问题,我的问题似乎是 Visual Studio 2013 中的一个错误,与用户控件上的“linkLabel”控件有关,该控件位于选项卡控件的选项卡之一上主要形式。

我在父表单上有其他没有引起任何问题的 linkLabel 控件。奇怪的是,并不是所有的标签都搞砸了,只有其中一些。我只能得出结论,它通过了部分布局重组,击中了用户控件,然后炸毁了,未能正确完成布局。我附加了第二个版本的 Visual Studio 来尝试捕获异常,并看到调试器中出现了各种状态行,但没有看到任何异常抛出。我不太熟悉这样做,所以有可能我做错了。

我可以将代码恢复到添加用户控件之后,但在 VisualStudio 在设计器中打开表单并自动重新生成设计器代码之前。此时,在设计器中打开表单总是会导致完全相同的设计失败。只要我不再在设计器中打开代码,一切都会在运行时正常工作。

如果我删除了对带有链接标签的自定义用户控件的任何引用,设计器也将毫无问题地打开。起初我以为我自己的代码有错误,所以我开始注释掉,但即使只是拖了基本元素,它仍然会发生。因此,我开始删除元素并一次添加一个,看看是什么破坏了它。就我而言,这原来是“linkLabel”控件。我不确定是否还有其他控件可以执行此操作。现在我只是计划重新编写代码以不在用户控件上使用链接标签,看看效果如何。

【讨论】:

  • 损坏的选项卡与保存 LinkLabel 的组件之间是否存在任何关系?这听起来很有希望,但这个表单没有任何 LinkLabels,所以我试图找出罪魁祸首可能是什么。
  • 无代码关系。就我而言,我从选项卡中删除了所有用户控件。我在存储库中创建了一个提交点,这样我就可以很快回到这个干净的状态。然后,我创建了一个新的空用户控件。我会将这个新的用户控件添加到选项卡中,关闭设计器编辑器并再次在设计器中重新打开它并检查。然后我会在用户控件中再添加一个控件并重试,直到找到破坏它的东西。您可以尝试相同的方法,看看特定的内容是否与链接标签具有相同的效果。
猜你喜欢
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-15
  • 1970-01-01
  • 2011-07-23
相关资源
最近更新 更多