限制自定义控件的可调整大小维度(C# .NET)

3
我正在使用MS Visual C#创建一个用户控件,有一件事情我找不到答案:
在设计视图中,如何限制控件可以调整大小的维度?
以内置的TrackBar控件为明显例子,它只能变宽而不能变高,并且仅在设计模式下显示左右的调整正方形。是否有方法来复制这个功能到用户控件中?
我已经尝试在设计器中为我的控件设置MinimumSize和MaximumSize值,但这并不是理想的结果。

MinimumSize和MaximumSize有什么问题? - Denis Palnitsky
一旦我的控件的实例被拖放到表单上,这些值将出现在属性浏览器中,因此用户可以覆盖它们。在有限的尺寸调整装饰也仍然存在,使得控件整体感觉不够专业。 - Byker Dave
3个回答

3
为了实现你所说的完整行为(顶部/底部或左侧/右侧没有装饰物)以及在设计时环境中进行自定义功能,你可能需要创建一个自定义控件设计器来设计你的控件。
这是一个庞大的主题,因为有很多事情可以做。实际上,你要做的就是创建一个继承自ControlDesigner的类,覆盖你需要的任何功能,然后使用DesignerAttribute在你的用户控件上注册它,为第二个参数指定typeof(IDesigner)(第一个参数为你的自定义ControlDesigner派生类型)。

增强设计时支持
自定义设计器
ControlDesigner类示例
Visual Studio .NET中的自定义设计时控件特性

现在,就 TrackBar 而言,它有自己的设计师,覆盖了 ControlDesigner.SelectionRules 属性。此属性只需让您返回一个枚举值(它是一个标记枚举,因此您可以将它们 OR 在一起),指示您的设计时选择装饰符如何出现(或不出现)。一旦通过设计师限制了设计时调整大小,就仅取决于您的控件本身通过 SetBoundsCore 来约束其自身大小。

我还强烈推荐下载Reflector。查看TrackBar的源代码(以及其关联的TrackBarDesigner),你可以了解它为实现你想要的行为所做的一切。 - Adam Sills

1

我相信你可以使用Control.SetBoundsCore来实现这个功能,具体描述在这里link text


1

关于调整大小的正方形,我不确定,但是MaximunSize和MinimumSize对您来说是正确的值。 但是仅在类的构造函数中设置它们是不够的,因为每次您将控件的实例从设计器拖放到表单上时,这些值都会在构造函数之后设置。

您应该:

重写MinumumSize和MaximumSize,并且不要从基础值而是从您的值中设置它们。

private Size maxSize = new Size(100, 5);
public override Size MaximumSize
{
    get { return base.MaximumSize; }
    set { base.MaximumSize = maxSize; }
}

在你的类中创建一个公共方法:
public bool ShouldSerializeMaximumSize()
{
    return false;
}

并且

private void ResetMaximumSize()
{
    me.MaximumSize = maxSize;
}

这些方法是 Windows Forms 设计器的惯例:http://msdn.microsoft.com/zh-cn/library/53b8022e.aspx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接