[英]Prevent Height control resizing at design-time
当用户在WindowsForms设计器上删除TextBox控件时,设计器只显示两个大小调整选择器来调整控件的宽度:
...除非手动启用TextBox.MultiLine
属性。
但是如果我们添加一个RichTextBox
,它会显示8个大小选择器:
...即使启用了RichTextBox.MultiLine
属性。
我想要做的是将RichTextBox
类子类RichTextBox
模仿TextBox
在设计时默认具有的大小调整行为,这意味着如果RichTextBox
不是多行,则防止高度/角大小。
确切地说,我想在设计时删除/隐藏高度和角度大小选择器,因此子类RichTextBox
应该只显示两个大小调整选择器来调整控件的宽度,就像在TextBox
上面的图像中一样。
我知道覆盖SetBoundsCore
方法以防止在设计时调整高度的方法 ,但是我想比该解决方案更远一点,因为该解决方案不会删除那些大小选择器......而只是让它可见的大小选择器在设计时是一种丑陋和令人困惑的行为。
我检查了正式的TextBox
类源代码,看看当TextBox.MultiLine
属性值发生变化时会发生什么 ,但我没有看到任何相关内容。
可能涉及分配给TextBox
类( System.Windows.Forms.Design.TextBoxBaseDesigner
)的DesignerAttribute()
类,也许是谁在设计时决定了大小调整行为?在这种情况下我可以做什么以及如何做它?。
这些称为大小句柄 ,由与控件关联的设计器中的SelectionRules()
方法确定。 要记住的一件事是常规TextBox
的默认值是MultiLine = False
但它与RichTextBox
相反。
您在参考源中找不到任何相关内容的原因是因为System.Windows.Forms.Design.TextBoxDesigner
是internal
/ Friend
。 另请注意,更改MultiLine
属性会导致重新RecreateHandle();
控件(源中的RecreateHandle();
)。
Imports System.Windows.Forms.Design
<Designer(GetType(RTBElektroDesigner))>
Public Class RTBElektro
Inherits RichTextBox
Public Sub New()
End Sub
End Class
Public Class RTBElektroDesigner
Inherits System.Windows.Forms.Design.ControlDesigner
Public Overrides ReadOnly Property SelectionRules() As SelectionRules
Get
Dim rtb = TryCast(MyBase.Control, RTBElektro)
If rtb Is Nothing Then
Return MyBase.SelectionRules
Else
If rtb.Multiline Then
Return SelectionRules.AllSizeable Or
SelectionRules.Moveable
Else
Return SelectionRules.LeftSizeable Or
SelectionRules.RightSizeable Or
SelectionRules.Moveable
End If
End If
End Get
End Property
End Class
结果:
此行为由TextBoxBaseDesigner实现。 也是RichTextBoxDesigner的基类,所以你对设计师很好。 这里缺少的是AutoSize属性,RichTextBox隐藏它。 将Multiline属性更改为False时,需要将其设置为True。 您无法从设计器执行此操作,因为它是隐藏的,默认值为False。
通过从RichTextBox派生自己的类,可以轻松解决这个问题:
using System;
using System.ComponentModel;
using System.Windows.Forms;
class RichTextBoxEx : RichTextBox {
public RichTextBoxEx() {
base.AutoSize = true;
base.Multiline = false;
}
[DefaultValue(true), Browsable(true), EditorBrowsable(EditorBrowsableState.Always)]
public override bool AutoSize {
get => base.AutoSize;
set => base.AutoSize = value;
}
[DefaultValue(false)]
public override bool Multiline {
get => base.Multiline;
set {
base.Multiline = value;
base.AutoSize = !base.Multiline;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.