可以在Designer生成的代码中重新排列布局调整语句吗?

时间:2015-03-27 10:48:38

标签: .net vb.net winforms visual-studio designer

为了轻松合并*.Designer.vb文件中的更改(同样适用于*.Designer.cs文件),我需要在Designer生成的文件中对某些代码段的内容进行排序因为Visual Studio is sometimes reordering them randomly。我可以在重新排列之前看到16个合并冲突, 0 之后的冲突。

我对排序声明等毫无疑问。但我对ResumeLayout(false)方法结束时的PerformLayout()InitializeComponent()调用表示怀疑。尽管有一些学习,但我还没有完全了解它们是如何工作的(practical details found here),因此我正在寻找答案是否可以安全地重新安排它们的对象顺序。呼吁。到目前为止,使用Designer测试没有显示问题,但我要求确定。

Form1.Designer.vb中的原始订单

Private Sub InitializeComponent()

    '...initializations of controls are left out

    '
    'Form1
    '
    Me.ClientSize = New System.Drawing.Size(784, 562)
    Me.Controls.Add(Me.TableLayoutPanel1)
    Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon)
    Me.Name = "Form1"
    Me.Text = "Form1 Title"

    'original order created by Designer
    CType(Me.ErrorProvider1, System.ComponentModel.ISupportInitialize).EndInit()
    Me.TableLayoutPanel1.ResumeLayout(False)
    Me.TableLayoutPanel1.PerformLayout()
    Me.page2.ResumeLayout(False)
    Me.page2.PerformLayout()
    Me.page1.ResumeLayout(False)
    Me.TableLayoutPanel2.ResumeLayout(False)
    Me.TableLayoutPanel2.PerformLayout()
    Me.TabCtl1.ResumeLayout(False)
    CType(Me.PictureBox1, System.ComponentModel.ISupportInitialize).EndInit()
    'end of section in question

    Me.ResumeLayout(False)

End Sub

Form1.Designer.vb

中的修改顺序
Private Sub InitializeComponent()

    '...initializations of controls are left out

    '
    'Form1
    '
    Me.ClientSize = New System.Drawing.Size(784, 562)
    Me.Controls.Add(Me.TableLayoutPanel1)
    Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon)
    Me.Name = "Form1"
    Me.Text = "Form1 Title"

    'the following lines (or pairs) were arranged alphabetically - is it OK?
    CType(Me.ErrorProvider1, System.ComponentModel.ISupportInitialize).EndInit()
    CType(Me.PictureBox1, System.ComponentModel.ISupportInitialize).EndInit()
    Me.page1.ResumeLayout(False)
    Me.page2.ResumeLayout(False)
    Me.page2.PerformLayout()
    Me.TabCtl1.ResumeLayout(False)
    Me.TableLayoutPanel1.ResumeLayout(False)
    Me.TableLayoutPanel1.PerformLayout()
    Me.TableLayoutPanel2.ResumeLayout(False)
    Me.TableLayoutPanel2.PerformLayout()
    'end of sorted groups

    Me.ResumeLayout(False)

End Sub

这种改变总是安全吗?或者命令是否应该根据控件的树层次结构(首先列出父级)而不是按字母顺序排列?

编辑:一些进一步的研究表明,表格设计师首先将祖先放在首位,但不强制执行其他特定排序。控制顺序仅由Control.Add()次调用的顺序决定。也许我可以改进排序方法来反映这一点,我应该是安全的。

1 个答案:

答案 0 :(得分:0)

我自己的答案是可能不是。在我最新的解决方案中,我避免依赖于确切的答案。

我通过将对象排序为树(将父对象放在第一个+按字母顺序排列在每个节点内)而不是按平面字母顺序转储对象来解决问题。这保留了Visual Studio设计器在订购对象时的逻辑,同时还修复了Visual Studio" randomness"通过应用总是确定性的订单。

重新安排*.Designer.vb内容的工具正在完成其工作。如果有兴趣的话,我可能会把它作为开源发布。