随风而去






4.41/5 (22投票s)
当一切都消失时,与设计师打交道。
引言
令人惊叹的是,您在一周的时间里对精心打磨的控件进行了着色、调整大小和移动之后,您的工作竟然会凭空消失。
问:您能阻止这种情况发生吗?
答:无法保证,但这里有一些对我有帮助的技巧,可以帮助我多次克服这种困境。
解释
如果您是 VS.NET V1.x 设计时环境的常规用户(至少在使用 C# 时是这样,我不太接触 VB,所以无法评论),那么您无疑会非常清楚令人惊叹的、具有自毁倾向的设计时环境所带来的影响。如果您是少数幸运者之一,尚未遇到过这种情况,我将向您解释症状。
您一直在设计器中愉快地工作,布置控件,绑定逻辑,在代码视图和设计器视图之间切换,生成,调试。然后,突然之间,您的一半控件消失了,或者一些控件移动到了左上角,或者您所有嵌入的资源(尤其是图像)都消失得无影无踪…… Ctrl+Z 似乎也无法正常工作……绝望的黑暗笼罩着显示器,您不得不去冲一杯非常浓的咖啡。然后再开始。
在办公室里,我们称之为“不幸”,而且我们经常遇到这种情况……。弄清楚它发生的原因非常棘手。找到可靠的重现方法几乎是不可能的;但我们发现了一些促成因素,一些可靠的避免问题的方法——以及在问题发生时如何减轻其影响。
首先要理解的是,这个问题是设计器在 `InitializeComponent()` 方法中生成的代码在往返过程中存在的一个缺陷。基本上,当情况不妙时,它有时会恐慌,然后就遗漏掉其中的一部分。它不会影响文件顶部的成员(保存子控件引用的字段仍然会保留),只会影响初始化代码。这就是为什么当问题发生时,您不能简单地添加与消失的控件同名的控件。它们与这些脱节的字段冲突。这引导我给出第一个技巧,适用于那些已经遭受过不幸的人。(参见技巧 5,了解如何在不幸发生时减轻其影响)。
丢失的资源
造成不幸的最常见原因之一是在应用程序中的某个控件仍然引用某个资源时删除了该资源。如果确实发生了这种情况,您将看到上面的图片,其中我们在代码的某个地方仍然引用一个名为“download_linux”的位图资源。
处理这种不幸很容易,您只需转到窗体设计器类即可。
找到本文第一张截图显示的错误消息中提到的缺失资源名称。
现在,用有效的资源引用替换缺失的资源引用。我总是会注释掉旧的引用,并将容器控件设置为 `null`。
this.pictureBox1.Image = null;
//global::WindowsApplication3.Properties.Resources.download_linux;
清理和重置
不幸的另一种形式是我称之为“清理和重置”,在这种情况下,设计器会重置您的工作,就好像您刚刚创建了一个新窗体一样。
处理这种不幸可能非常棘手,但您应该首先尝试做的就是平静地重启 IDE,并在重启前保存。
如果仍然是清理和重置,请尝试以下操作:
- 关闭已清理和重置的设计器选项卡
- 关闭 IDE
- 转到解决方案文件夹,并将已清理和重置的设计器类(通常后缀为 (.Designer.cs))移动到另一个文件夹。
- 再次打开 IDE,然后从解决方案资源管理器窗口中删除移动的类节点。
- 从“项目”转到“添加现有项”,然后浏览到之前移动的设计器类,您就完成了。
仍然无法解决?
以下是一些有助于克服/减少不幸发生次数的技巧……
技巧 1
如果您有一个已保存但已损坏的文件,并且正试图从不幸中恢复,请清理孤立的字段,以便您可以重用这些名称。
但理想情况下,我们应该完全避免这种不幸!我们想要的是一个在 IDE 中使用 WinForms 项目的过程,不会出现问题。我们该如何实现呢?
嗯,问题通常发生在你没有一个干净、正常运行的解决方案构建,包括所有可设计控件的依赖项。现在——大多数时候,这不是问题。毕竟,您可以在不构建解决方案的情况下直接使用设计器。但如果您的设计图面上有来自另一个程序集(甚至同一个程序集)的控件,而它没有 100% 成功构建并复制到某处,它可能被设计时环境(项目目录即可)引用,那么您就可能遇到不幸。因此,您应该遵循技巧 2。
技巧 2
在尝试打开任何设计器之前,始终执行完整的解决方案构建。
不幸的是,默认情况下,VS.NET IDE 会重新打开您上次关闭解决方案时打开的视图;当您再次打开解决方案但未干净构建时,这不太理想。因此,您还应该应用技巧 3。
技巧 3
关闭解决方案之前,始终关闭所有设计器窗口。
好的,现在我们进行构建。如果构建不干净,请参考技巧 2,然后仅使用代码编辑器进行清理,直到构建成功为止。
当它构建干净后,我们就可以打开设计器,进行布局,添加代码等。一切应该都很好。当我们准备好进行构建和测试时,应用技巧 4。
技巧 4
在进行构建之前,关闭所有设计器窗口。
我怎么强调都不为过。在关闭所有设计器之前,切勿,切勿构建解决方案。事实上,最好编写一个宏来为您完成这项工作,并用对该宏的调用来替换生成/运行/调试快捷方式、按钮和菜单。或者非常自律。您会 9 次成功,第 10 次……就完了。
好的,我们已经关闭了设计器窗口并启动了构建。如果构建失败——请参考技巧 2。别忘了——您必须清理所有东西,以便只使用代码编辑器进行构建。不要意外打开设计器……当它干净构建后,您可以重复这个过程。
如果您遵循这些指南,您将避免 99% 的不幸情况。但还有其他几种不幸的情况可能会降临到我们头上……
第一种情况发生在当我们引用预构建的外部程序集中的控件时(即,我们引用的是程序集本身,而不是解决方案中的项目)。您打开设计器,然后控件要么从设计图面上消失了,要么出现设计时异常(导致痛苦的文本块,表明设计器对您的控件出现了恐慌)。首先,应用技巧 5。技巧 5 非常有用!
技巧 5
不幸发生时,不要惊慌。不要按保存。不要按撤销。只需关闭设计器窗口(以及任何适用的代码窗口),然后说“不——我不想保存更改”。
如果您这样做,那么损坏的代码就不会被保存。它将恢复到打开设计器之前的版本。技巧 5 在您不小心违反技巧 2-4 中的任何指南时也很有用。
那么——具体原因是什么呢?似乎与设计时环境无法找到它刚才还有的引用有关。文件没有移动,没有人重新编译它们。设计器就是看不惯它们了。您可以关闭 IDE 并重新加载它,它仍然不起作用。因此,应用技巧 6。
技巧 6
删除对包含消失控件的程序集的引用,然后重新添加它们。
然后您可以重新打开设计器,一切都会好起来……
最后,还有最棘手的问题。您可以构建一个具有导致设计时异常的实现错误的控件。一切都会正常构建,但当您重新打开设计器时,您会看到异常文本。像往常一样,设计器可以在 10 次中有 9 次恢复,但第 10 次就会导致不幸。
恢复很简单——您应该首先应用技巧 5,然后仅使用代码编辑器修复问题。修复它可能很棘手。如果检查不起作用,一个有用的技巧是打开第二个 IDE,并附加到原始 VS.NET 实例。然后您可以在您的控件中设置一些断点,并在打开设计器时观察会发生什么。
其中一些技巧有点繁琐,需要一些纪律,但如果您遵循这些指南,您应该几乎完全避免不幸,并在不幸发生时轻松恢复。
贷方
这篇文章中的一些内容属于某位博主。我在我保存的离线页面上甚至找不到他的名字,也找不到那个页面的 URL,所以请您,如果您是那位博主,请在这里留下您的名字,因为我个人非常感谢您分享您处理“不幸”的经验。
也感谢我们的朋友 Martin 建议我发布这篇文章。