我想在自定义控件(不是用户控件)中实现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);
}
关于以标准方式执行此操作的任何想法?
答案 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
逻辑