如何防止VisualStudio设计器将BeginInit和EndInit方法添加到代码中?

时间:2012-04-26 10:40:44

标签: c# winforms visual-studio

当visual studio designer在代码中添加以下行时,我的应用UI会经历一些不合需要的位移。

((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
:
:
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();

我该如何预防?


版:

我创建了一个只有两个嵌套SplitContainer的新简单项目,遇到了同样的问题。

问题:

正如以下代码中标记的那样,SplitterWidth的{​​{1}}保持不变!如果您删除splUpperSectionBeginInit方法,则此属性(EndInit)将会更改! 这是一个远程的BUG ???

SplitterWidth方法包含Visual Studio设计器自动生成的代码。您还可以简单地创建一个新表单,并向其中添加两个嵌套的拆分容器,其InitializeSplitContainers为{1},以便轻松触及问题。

代码:

SplitterWidth

解决方法:

using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace TestApp
{
    public partial class Form1 : Form
    {
        //
        // SplitContainers
        //
        private SplitContainer splBase;
        private SplitContainer splUpperSection;

        /// <summary>
        /// The form has initially no child control.
        /// </summary>
        public Form1()
        {
            InitializeComponent();
            InitializeSplitContainers();
        }

        private void InitializeSplitContainers()
        {
            this.splBase = new SplitContainer();
            this.splUpperSection = new SplitContainer();
            ((ISupportInitialize)(this.splBase)).BeginInit();
            this.splBase.Panel1.SuspendLayout();
            this.splBase.SuspendLayout();
            ((ISupportInitialize)(this.splUpperSection)).BeginInit();
            this.splUpperSection.SuspendLayout();
            this.SuspendLayout();
            // 
            // splBase
            // 
            this.splBase.BackColor = Color.Red;
            this.splBase.Dock = DockStyle.Fill;
            this.splBase.FixedPanel = FixedPanel.Panel1;
            this.splBase.IsSplitterFixed = true;
            this.splBase.Location = new Point(0, 0);
            this.splBase.Name = "splBase";
            this.splBase.Orientation = Orientation.Horizontal;
            // 
            // splBase.Panel1
            // 
            this.splBase.Panel1.Controls.Add(this.splUpperSection);
            // 
            // splBase.Panel2
            // 
            this.splBase.Panel2.BackColor = Color.White;
            this.splBase.Size = new Size(400, 400);
            this.splBase.SplitterDistance = 115;
            this.splBase.SplitterWidth = 1;
            this.splBase.TabIndex = 0;
            // 
            // splUpperSection
            // 
            this.splUpperSection.BackColor = Color.Chartreuse;
            this.splUpperSection.Dock = DockStyle.Fill;
            this.splUpperSection.FixedPanel = FixedPanel.Panel1;
            this.splUpperSection.IsSplitterFixed = true;
            this.splUpperSection.Location = new Point(0, 0);
            this.splUpperSection.Name = "splUpperSection";
            this.splUpperSection.Orientation = Orientation.Horizontal;
            // 
            // splUpperSection.Panel1
            // 
            this.splUpperSection.Panel1.BackColor = Color.White;
            // 
            // splUpperSection.Panel2
            // 
            this.splUpperSection.Panel2.BackColor = Color.White;
            this.splUpperSection.Size = new Size(400, 115);
            this.splUpperSection.SplitterDistance = 25; // ←Will be set
            this.splUpperSection.SplitterWidth = 1;     // ←Won't be set (stays: 4)
            this.splUpperSection.TabIndex = 0;
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new SizeF(6F, 13F);
            this.AutoScaleMode = AutoScaleMode.Font;
            this.ClientSize = new Size(400, 400);
            this.Controls.Add(this.splBase);
            this.Name = "Form1";
            this.Text = "Bug Form";
            this.splBase.Panel1.ResumeLayout(false);
            ((ISupportInitialize)(this.splBase)).EndInit();
            this.splBase.ResumeLayout(false);
            ((ISupportInitialize)(this.splUpperSection)).EndInit();
            this.splUpperSection.ResumeLayout(false);
            this.ResumeLayout(false);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

这些调用需要通知this.splitContainer1对象已完成所有初始化,以避免必须按指定的顺序输入对象属性值。

只有在调用EndInit时,才会评估属性的值。

如果你在对象proeprties上设置的值没有取代对象,那么这不应该取代你的UI。

编辑:调用EndInit()时唯一发生的是执行以下方法的容器:

if (this.newPanel1MinSize != this.panel1MinSize)
{
    this.ApplyPanel1MinSize(this.newPanel1MinSize);
}
if (this.newPanel2MinSize != this.panel2MinSize)
{
    this.ApplyPanel2MinSize(this.newPanel2MinSize);
}
if (this.newSplitterWidth != this.splitterWidth)
{
    this.ApplySplitterWidth(this.newSplitterWidth);
}

所以你的问题必须与这3个属性中的一个或多个有关。

答案 1 :(得分:0)

当我从2010年到2015年迁移的工作项目合并更改时出现此错误。在更新的项目中,设计器中添加了2个新行:

top

        ((ISupportInitialize)(this.splBase)).BeginInit();

如果我运行2015年运行的版本,它运行没有问题。

要在VS 2010中解决此问题,我删除了这两行。之后,该项目一直很好。