gpt4 book ai didi

c# - 如何为自定义控件实现 AutoSize 属性?

转载 作者:太空狗 更新时间:2023-10-29 23:16:59 25 4
gpt4 key购买 nike

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

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

当 AutoSize 为真时,标准 .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);
}

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

最佳答案

这是让您的控件自动调整大小的秘诀。

创建方法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 );
}

关于c# - 如何为自定义控件实现 AutoSize 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9857041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com