获取winform控制设计大小

时间:2017-08-01 00:59:21

标签: c# winforms

我正在尝试以win形式制作可折叠面板。我可以降低高度,使其看起来像动画折叠,但是由于折叠后原始设计高度丢失,我无法展开它。

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

上面的代码动画面板折叠。但是,当panel1.Height现在等于label1.Height时,如何将其展开?如何进入设计阶段panel1.Height?有没有办法获得面板的设计尺寸?

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

3 个答案:

答案 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;