我正在尝试以win形式制作可折叠面板。我可以降低高度,使其看起来像动画折叠,但是由于折叠后原始设计高度丢失,我无法展开它。
while (panel1.Height > label1.Height)
{
panel1.Height--;
}
上面的代码动画面板折叠。但是,当panel1.Height
现在等于label1.Height
时,如何将其展开?如何进入设计阶段panel1.Height
?有没有办法获得面板的设计尺寸?
我不希望在折叠期间将原始高度放入存储的变量中,因为我可以拥有数百个面板。此外,我不希望硬编码高度,因为在设计过程中所有面板都会有不同的高度。
答案 0 :(得分:1)
您可以创建自定义并添加DefaultHeight
之类的属性,您可以使用当前高度填充该属性。
这样的事情:
public class CustomPanel : Panel
{
public int DefaultHeight { get; private set; }
public CustomPanel()
{
// Add an event, which gets triggered at the next resize.
// We need this event, because at initializing the Control have the default Height.
// The Resize event getting triggered, when the Form load and initializes the Controls.
this.Resize += this.Initial_Resize;
}
private void Initial_Resize(object sender, EventArgs e)
{
// Set the DefaultHeight to the value of the new Size
this.DefaultHeight = this.Height;
// Remove the event, otherwise DefaultHeight would get overridden at every resize.
this.Resize -= this.Initial_Resize;
}
}
使用此代码,您可以在表单中使用新的CustomPanel,并使用DefaultHeight
属性在折叠后展开控件。
可能有更好的方法,但这可以帮助您而不需要进一步的努力。任何建议都是受欢迎的。
答案 1 :(得分:0)
您必须在崩溃面板之前将panel1.Height
存储在班级(字段或属性)的某个位置。设计大小只是你班级的初始字段值,你无法在运行时获得它们。
有关初始字段值的更多详细信息,请参阅Get default value of class member
要么
How can I get the default value of a field in a class in C#?
如果您有多个面板控件,请在每个面板折叠前使用Dictionary<Control, int>
存储高度。
此外,如果用户更改应用程序中面板的大小,此解决方案将允许您将面板恢复到崩溃前的位置,而不仅仅是在设计时。
答案 2 :(得分:0)
感谢您提出的所有建议。我想最好的方法是创建另一个控制,Nik Bo和Chetan Ranpariya建议。由于这个项目可能会被其他程序员传递和编辑,新程序员可能会将这个新控件误认为是标准面板,并在项目的其他部分使用标准面板。这也是为什么我不喜欢新控件的想法,如果在后期阶段信息没有传递下去。
目前我在面板中使用一个面板来确定控制autosize
效果的边界。虽然折叠功能仍然相同,但我使用autosize = true
展开了面板。以下是代码。
折叠:
while (panel1.Height > label1.Height)
{
panel1.AutoSize = false;
panel1.Height--;
}
扩展:
panel1.AutoSize = true;