2017-08-01 112 views
1

我想在win窗体中制作一个可折叠的面板。我可以降低高度,使其看起来像动画崩溃,但我无法扩展它,因为原始设计高度在崩溃后丢失。获取winform控件的设计大小

while (panel1.Height > label1.Height) 
    { 
     panel1.Height--; 
    } 

上面的代码为面板折叠设置了动画效果。但是,如何将其展开回panel1.Height现在等于label1.Height?我如何获得设计阶段panel1.Height?有没有一种方法来获得面板的设计尺寸?

我不希望在折叠到存储变量期间放置原始高度,因为我可能有数百个面板。另外,我不希望硬编码高度,因为在设计过程中所有的面板都会有不同的高度。

+0

请把至今 – Nick

+0

嗨尼克代码添加 – ishtarsg

+0

您可以使用标签的标签属性,你已经尝试过的情况,并设置代码示例到form_load的初始高度。另一种方法是创建从Panel继承的新控件并拥有新属性InitialHeight。使用该控件并在form_load中设置该属性值并使用它来增加面板高度。 –

回答

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属性崩溃后扩大控制。

可能有更好的方法,但这会帮你没有进一步的努力。任何建议都是值得欢迎的。

0

在折叠面板之前,您必须将panel1.Height存储在班级(字段或属性)中的某个位置。设计大小只是你的类的初始字段值,你不能在运行时获得它们。关于初始字段值

更多细节你可以阅读Get default value of class memberHow can I get the default value of a field in a class in C#?

如果你有很多面板控件,则使用Dictionary<Control, int>每个面板崩溃之前存储的高度。

此外,如果用户在应用程序中更改面板的大小,而不仅仅是在设计时间内,此解决方案将允许您将面板恢复到崩溃之前的位置。

0

感谢您的所有建议。我想最好的办法是创建另一个控制Nik Bo和Chetan Ranpariya的建议。由于这个项目可能会被其他程序员传递和编辑,所以新程序员可能会将这个新控件当作标准面板,并在项目的其他部分使用标准面板。这也是为什么我不喜欢新控件的想法的原因,如果在后期信息不传递下去。

目前,我正在使用面板内的面板来确定控制autosize效果的边界。虽然折叠功能仍然相同,但我通过使用autosize = true来扩展面板。以下是代码。

对于崩溃:

while (panel1.Height > label1.Height) 
{ 
    panel1.AutoSize = false; 
    panel1.Height--; 
} 

扩大:

panel1.AutoSize = true;