dav*_*v_i 6 c# user-controls .net-3.5 visual-studio-2008
我试图在VS2008中创建一个简单的用户控件(不是WPF),它实际上是SplitContainer一个按钮Panel1,当按下时,切换Panel2Collapsed属性并将控件的大小调整为大小Panel1.
以下是控件的基本内容:
private int _openHeight;
private int _closedHeight;
public MyUserControl(bool open)
{
InitializeComponent();
_openHeight = this.Height;
_closedHeight = splitContainer1.SplitterDistance;
Open = open;
}
private bool _open;
private bool Open
{
get { return _open; }
set
{
_open = value;
splitContainer1.Panel2Collapsed = !_open;
this.Height = _open ? _openHeight : _closedHeight;
}
}
private void button1_Click(object sender, EventArgs e)
{
Open = !Open;
}
Run Code Online (Sandbox Code Playgroud)
问题是,this.HeightRuntime是控件在用户控件设计器中的值,而不是主窗体设计器中设计时设置的值.
任何帮助将不胜感激.
UPDATE
继Lucas的解决方案之后,这种方式意味着_openHeight只设置一次,从而产生了预期的效果:
private int? _openHeight;
private int _closedHeight;
public MyUserControl(bool open)
{
InitializeComponent();
//the _closedHeight doesn't change so can be defined in the constructor
_closedHeight = splitContainer1.SplitterDistance;
//set value
Open = open;
this.SizeChanged += new EventHandler(MyUserControl_SizeChanged);
this.Load += new EventHandler(MyUserControl_Load);
}
void MyUserControl_SizeChanged(object sender, EventArgs e)
{
//this event is called BEFORE the _Load event so gets the height set in the designer
// and not any changes at run time (e.g. when you collapse the control)
if (_openHeight == null)
_openHeight = this.Height;
}
private bool _open;
private bool Open
{
get { return _open; }
set
{
_open = value;
if (_open)
{
//sets height only if it has been initialized
if (_openHeight != null)
this.Height = (int)_openHeight;
}
else
{
this.Height = (int)_closedHeight;
}
}
}
void MyUserControl_Load(object sender, EventArgs e)
{
//now that control is loaded, set height
Open = Open;
}
private void button1_Click(object sender, EventArgs e)
{
Open = !Open;
}
Run Code Online (Sandbox Code Playgroud)
你正在它的构造函数中读取控件的Height属性,这意味着它可能在表单中显示之前.问题是,当需要在窗体中显示控件时,大小似乎会被调整.在此之前,它是控件设计器中设置的值,您现在正在获得该值.
解决问题的最简单方法是Height在确定控件已经在窗体中绘制时读取值,即可以从open控件的构造函数中获取参数,添加一个初始化的新方法,Open并_closedHeight在Load事件中调用它.表格.
像这样的东西:
public MyUserControl()
{
InitializeComponent();
}
public AdjustControlSize(bool open)
{
_openHeight = this.Height;
_closedHeight = splitContainer1.SplitterDistance;
Open = open;
}
//the rest of the control's code is unchanged
...
Run Code Online (Sandbox Code Playgroud)
然后AdjustControlSize从form的Load事件中调用方法.
具有事件机制的解决方案
您还可以使用控件自己的事件来Height适当地读取.这样您就不必更改Form代码中的任何内容.
所以,在这种情况下,代码看起来像这样(虽然我没有测试过):
public MyUserControl(bool open)
{
InitializeComponent();
_openHeight = this.Height;
_closedHeight = splitContainer1.SplitterDistance;
Open = open;
this.SizeChanged += new EventHandler(MyUserControl_SizeChanged);
}
void CustomPictureBox_SizeChanged(object sender, EventArgs e)
{
_openHeight = this.Height;
_closedHeight = splitContainer1.SplitterDistance;
}
Run Code Online (Sandbox Code Playgroud)
这样,控件可以在每次改变尺寸时自行调整.
| 归档时间: |
|
| 查看次数: |
12913 次 |
| 最近记录: |