当visual studio designer在代码中添加以下行时,我的应用UI会经历一些不合需要的位移。
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
:
:
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
我该如何预防?
的版: 的
我创建了一个只有两个嵌套SplitContainer
的新简单项目,遇到了同样的问题。
►问题:
正如以下代码中标记的那样,SplitterWidth
的{{1}}保持不变!如果您删除splUpperSection
和BeginInit
方法,则此属性(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);
}
}
}
答案 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中解决此问题,我删除了这两行。之后,该项目一直很好。