现在有这样一个需求,窗口要被分割成左右两部分,点击左边的菜单,右边显示对应的窗体(也许是Panel或者Form),并且在主窗口大小变化时,右边的窗体中的控件的位置和大小都能响应的变化,保证能显示出所有的控件。而且右边的窗体在开发期间也能进行可视化编辑。
我原来的做法是,先创建一个Form的窗体,进行可视化编辑,编辑完成后,将其改成从Panel继承而来的组件,并将其显示在主窗体的右半部分。这样做的缺点是,Panel组件无法做可视化编辑(像Form窗体那样)。哪位仁兄能帮忙出出主意,给个完整的解决方案。谢谢!!!!
补充,主窗体是Form + Splitter + Panel的组合。
我原来的做法是,先创建一个Form的窗体,进行可视化编辑,编辑完成后,将其改成从Panel继承而来的组件,并将其显示在主窗体的右半部分。这样做的缺点是,Panel组件无法做可视化编辑(像Form窗体那样)。哪位仁兄能帮忙出出主意,给个完整的解决方案。谢谢!!!!
补充,主窗体是Form + Splitter + Panel的组合。
---那自动缩放呢???有办法么???
UserControl2 us2 = new UserControl2();
us2.Dock = DockStyle.Fill;
us2.Parent = this.pl_right;
pl_right.Controls.Add(us2);
foreach( Control control in us2.Controls )
{
control.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right;
}
结合Dock属性使用.基本上可以解决缩放问题.
使用起来和Web的中table差不多.
UserControl2 us2 = new UserControl2();
us2.Dock = DockStyle.Fill;
us2.Parent = this.pl_right;
pl_right.Controls.Add(us2);
foreach( Control control in us2.Controls )
{
control.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right;
}区分UserControl的加载,和UserControl上面的control加载。
前者是在窗体初始化的时候,因此在加载UserControl对象的时候,再进行初始化相应的参数;
后者是定义UserControl的时候,因此你应该在其内部设置各个control的anchor。
public UserControl2()
{
// 该调用是 Windows.Forms 窗体设计器所必需的。
InitializeComponent(); // TODO: 在 InitializeComponent 调用后添加任何初始化
foreach( Control control in this.Controls )
{
control.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;
}
}不知道是否正确。
这样出来的结果是,控件能自动缩放,但不是按照比例进行缩放。例如,窗体的宽度从100变成了110,控件的宽度应该是增加百分之十,而现在的效果是控件的宽度也增加了10。我希望的是按照比例增加。
我在主窗口的又边的Panel的SizeChanged事件中添加如下代码:
private void pl_right_SizeChanged(object sender, System.EventArgs e)
{
mutexSize.WaitOne();
if( this.oldHeight == 0 && this.oldWidth == 0 )
{
this.oldHeight = this.pl_right.Height;
this.oldWidth = this.pl_right.Width;
return;
} long newHeight = this.pl_right.Height;
long newWidth = this.pl_right.Width; float rateHeight = ((float)newHeight)/oldHeight;
float rateWidth = ((float)newWidth)/oldWidth; this.oldHeight = pl_right.Height;
this.oldWidth = pl_right.Width; // pl_right == panel
foreach( UserControl userControl in pl_right.Controls )
{
foreach( Control control in userControl.Controls )
{
control.Location = new Point( (int) Math.Round(control.Location.X * rateWidth, 0), (int) Math.Round(control.Location.Y * rateHeight, 0));
control.Size = new Size( (int) Math.Round(control.Size.Width * rateWidth, 0), (int) Math.Round(control.Size.Height * rateHeight, 0));
}
}
mutexSize.ReleaseMutex();
}但是效果也不好。移动得快了或做了其他什么事情,控件地位置和大小也会乱。规律还没找到,惭愧。
public UserControl2()
{
// 该调用是 Windows.Forms 窗体设计器所必需的。
InitializeComponent(); // TODO: 在 InitializeComponent 调用后添加任何初始化
foreach( Control control in this.Controls )
{
control.Anchor = AnchorStyles.None;
}
}
在反复移动后,UserControl上控件的位置坐标甚至出现了负值!!!
如果Panel的anchor的也要清掉,那么就要自己手动设置Panel的大小,可是我还不知道如何计算那块区域的大小,望赐教!界面很简单,左边一个ListView, Dock为Left,ListView的右边是一个Splitter,再右边就是Panel了。这个Panel的大小和位置该如何计算呢???
大致步骤如下:
1、定义usercontrol的时候,在usercontrol的SizeChanged事件中,去处理缩放
private void CtrlAutoSize_SizeChanged(object sender, System.EventArgs e)
{
//Resize all controls
Size siz = this.ClientSize;
btnGet.Bounds = new Rectangle( (int)(siz.Width * 0.01), (int)(siz.Height * 0.01),
(int)(siz.Width * 0.15), (int)(siz.Height * 0.15) );
lblTest.Location = new Point( (int)(siz.Width * 0.01) + btnGet.Width + 10 ,
(int)(siz.Height * 0.01) ); picImage.Bounds = new Rectangle(
(int)(siz.Width * 0.01), (int)( siz.Height * 0.01) + btnGet.Height + 10,
siz.Width - (int)(siz.Width * 0.01) * 2,
siz.Height - ((int)(siz.Height * 0.01) + btnGet.Height + 20) ); }2、在窗体加载的时候,如下加载即可
CtrlAutoSize myControl = new CtrlAutoSize();
myControl.Visible = true;
myControl.Dock = DockStyle.Fill;//Set its dock style
panel1.Controls.Add( myControl );
无论如何,感谢您的帮助。
最后,还有什么好的点子么??
--您知道这几个控件的问题出在哪里么???
按照您给的百分比的方法,我知道可行得多,但开发周期太长了呀,拖不起呀。