Vb.net 在具有大量控件的复杂窗体上,设计视图速度非常慢

Vb.net 在具有大量控件的复杂窗体上,设计视图速度非常慢,vb.net,forms,windows-forms-designer,visual-studio-express,Vb.net,Forms,Windows Forms Designer,Visual Studio Express,让我们从一个自白开始:我来自VB6背景,我习惯于在窗体上对象的事件中编码,因此我的事件代码在代码窗口中以某种随机顺序结束。有了这个习惯,记住控件的名称从来都不是很重要(尽管我把它们命名得很好)。。。我只需双击design视图中的一个按钮,就可以直接看到该控件主要事件的代码。如果我忘记了控件的名称,我会单击它并查看属性。这不是我已经改掉的习惯 好吧,现在我明白了。使用VS Express 2013,我有一个表单,其中包含大量容器、标签、按钮和其他小技巧。我从VS.NETExpress 2008移植

让我们从一个自白开始:我来自VB6背景,我习惯于在窗体上对象的事件中编码,因此我的事件代码在代码窗口中以某种随机顺序结束。有了这个习惯,记住控件的名称从来都不是很重要(尽管我把它们命名得很好)。。。我只需双击design视图中的一个按钮,就可以直接看到该控件主要事件的代码。如果我忘记了控件的名称,我会单击它并查看属性。这不是我已经改掉的习惯

好吧,现在我明白了。使用VS Express 2013,我有一个表单,其中包含大量容器、标签、按钮和其他小技巧。我从VS.NETExpress 2008移植了我的代码,在那里这不是问题。但是现在,在设计视图中选择任何控件都需要大约10秒钟的时间才能查看其属性。如果我拖动一个控件来调整其大小,再过10秒我就可以选择另一个控件了。这使得设计这种表单几乎不切实际

在这个特定的项目中,我使用一个tab控件(用户永远看不到)来设计许多“屏幕”,每个“屏幕”都包含充满控件的面板。每个“屏幕”的面板从选项卡中移出,并根据用户更改屏幕的请求固定到主窗体中。(我用“屏幕”这个词是指一个充满控件的窗口,通常是最大化的。)

在同一个项目中,简单的模式密码更改表单在可视化地编辑控件方面并不慢,即使复杂表单在IDE中仍然可见

我的问题分为三个部分:

首先,它花了那么多时间在干什么

,是否有一个设置可以调整以提高速度

第三个,我是否应该放弃尝试按原样加速,并出于设计目的将每个“屏幕”移动到自己的形式,以避免这种缓慢?(现在要做的工作很多……见下一段。)

到目前为止,我一直避免将“屏幕”分离到单独的表单上,因为我不希望在用户更改屏幕时出现新窗口,并且因为一个屏幕中控件的代码可能会影响其他屏幕上控件的属性。。。在这种情况下,我宁愿不写出来

form.doohickey.text=“blah”

…但还是把它当作

doohickey.text=“blah”


我正在使用VB,但我不认为这个问题是VB特有的。)

首先,我感觉到了你的痛苦。我正在编写的应用程序中有一个管理部分,我也在使用TabControl。到目前为止,我有10个选项卡,我只在大约4-5个选项卡上添加了控件。我只是把我拥有的控件加起来,到目前为止,这个表单上有大约360个控件,设计器文件大约有3300行长。目前,每当我更改某个控件的属性值或保存设计器时,每次大约需要3-4秒。我有一台相当不错的机器;i5-3320M,8GB RAM,intel 330 SSD,在tabControl中执行操作仍然需要一点时间。在表单上打开并加载设计器也需要花费很长时间


我发现,打开VisualStudio的新实例、创建测试应用程序、添加具有相同属性的TabControl以及从此处设计新的tab页面更容易。完成后,我将复制粘贴到实际项目中。除了我在主应用程序项目中编写的几个自定义控件外,这项功能非常有效。添加它们时,我只需坐着等待。

我现在回答我自己的问题。这是我最终使用的方法,它帮助了很多

我的总体目标是拥有一个界面,该界面没有显示很多窗口,但仍然显示许多不同的“屏幕”

我曾经将不同“屏幕”的所有不同控件放在不同的面板上,每个面板都包含在一个不可见选项卡控件的单独选项卡中。然后,根据需要,通过更改每个面板的父属性,将这些面板移动到我的主窗体。唯一的问题是Winforms设计器速度慢得可笑,因为表单上的控件数量增加到了数百个

现在,我将每个“屏幕”设计为一个单独的表单,每个表单都包含一个面板,其Dock property=Fill。这样的面板包含表单上的所有其他内容。形式本身永远不可见

根据查看各种屏幕的需要,我执行:

ScreenForm.Panel1.Parent=Mainform

…或者,取决于我的布局

ScreenForm.Panel1.Parent=Mainform.PanelXYZ

…我还可以卸载或隐藏面板的新容器中已经存在的任何面板

我很高兴地发现,面板中包含的控件的各种事件的代码仍然会运行,因为这样的代码存在于第一个表单的文件中,而不是显示的表单的文件中。幸运的是,看来我错了。事件代码跟随控件本身。我不仅可以复制/粘贴控件,还可以将其相应的事件代码复制/粘贴到新窗体,以便于开发和更快的Winforms设计器

所有这些都类似于具有最大化窗口的MDI界面,但不显示标题栏或[X]


基本上,我做的一切都和以前一样,除了使用带面板的单独窗体,而不是带面板的单独选项卡。WinForms designer要快得多,因为任何窗体上都没有那么多控件。

我想我意外地找到了一个解决方法,可以在人口过多的容器/项目上更改控件名称时节省大量时间。在更改名称之前,将要重命名的控件的“Generate Member”属性切换为False/True(我相信您也可以在“name”属性下找到它)。这将为该过程添加更多的单击