如何将AutoSize属性实现为自定义控件?

时间:2012-03-25 00:51:34

标签: c# .net winforms custom-controls autosize

我想在自定义控件(不是用户控件)中实现AutoSize属性,使其行为与其他标准.NET WinForms控件一样,在设计中实现AutoSize(ala CheckBox)模式。

我已经设置了属性,但这是控件在设计模式下的行为方式让我感到烦恼。 它仍然可以调整大小,这没有意义,因为视觉调整大小没有反映在我实现的AutoSize和Size属性中。

当AutoSize为true时,标准.NET控件不允许在设计模式下调整大小(甚至显示调整大小句柄)。我希望我的控制能够以同样的方式运作。

编辑:我使用SetBoundsCore()覆盖工作,但当AutoSize设置为true时,它不会在视觉上限制调整大小,它只是具有同样的效果;功能相同,但感觉不自然。

protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified)
{
    if (!this.auto_size)
        this.size = new Size(width, height);
    base.SetBoundsCore(x, y, this.size.Width, this.size.Height, specified);
}

关于以标准方式执行此操作的任何想法?

4 个答案:

答案 0 :(得分:5)

这是我控制AutoSize的方法。

创建一个方法GetAutoSize(),根据您的具体实现计算控件所需的大小。也许这是它包含的文本的大小或当前宽度的控件的总高度,无论如何。

创建一个方法ResizeForAutoSize()以强制控件在其状态发生变化后调整自身大小。例如,如果控件的大小适合其包含的文本,则更改文本时应调整控件的大小。只需在文本更改时调用此方法。

覆盖GetPreferredSize()以通知想要知道的人(例如FlowLayoutPanel)我们的首选大小。

重写SetBoundsCore()以强制执行调整规则,方法与无法调整AutoSize标签的大小相同。

请参见此处的示例。

/// <summary>
/// Method that forces the control to resize itself when in AutoSize following
/// a change in its state that affect the size.
/// </summary>
private void ResizeForAutoSize()
{
    if( this.AutoSize )
        this.SetBoundsCore( this.Left, this.Top, this.Width, this.Height,
                    BoundsSpecified.Size );
}

/// <summary>
/// Calculate the required size of the control if in AutoSize.
/// </summary>
/// <returns>Size.</returns>
private Size GetAutoSize()
{
    //  Do your specific calculation here...
    Size size = new Size( 100, 20 );

    return size;
}

/// <summary>
/// Retrieves the size of a rectangular area into which
/// a control can be fitted.
/// </summary>
public override Size GetPreferredSize( Size proposedSize )
{
    return GetAutoSize();
}

/// <summary>
/// Performs the work of setting the specified bounds of this control.
/// </summary>
protected override void SetBoundsCore( int x, int y, int width, int height,
        BoundsSpecified specified )
{
    //  Only when the size is affected...
    if( this.AutoSize && ( specified & BoundsSpecified.Size ) != 0 )
    {
        Size size = GetAutoSize();

        width   = size.Width;
        height  = size.Height;
    }

    base.SetBoundsCore( x, y, width, height, specified );
}

答案 1 :(得分:0)

在控件的构造函数中,调用SetAutoSizeMode(AutoSizeMode.GrowAndShrink)。

答案 2 :(得分:0)

覆盖SizeFromClientSize()方法。在此方法中,您必须计算控件所需的大小并将其返回。

答案 3 :(得分:0)

您只需要在自定义控件声明的顶部添加这两行

[Designer("System.Windows.Forms.Design.LabelDesigner")]
[ToolboxItem("System.Windows.Forms.Design.AutoSizeToolboxItem")]

自然实现您的Autosize逻辑