假想
当用户在TextBox控件上删除WindowsForms设计器时,设计器只显示两个调整控件大小的选择器:
...Unless TextBox.MultiLine
属性是手动启用的。
但是,如果我们添加一个RichTextBox
,它将显示8个大小选择器:
如果启用了...even属性,则为RichTextBox.MultiLine
。
发问
我想做的是对一个RichTextBox
类进行子类化,以模仿TextBox
在设计时默认的大小调整行为,这意味着如果RichTextBox
不是多行的话,可以防止高度/角的大小调整。
确切地说,我希望在设计时删除/隐藏高度和角大小选择器,因此子类RichTextBox
应该只显示两个大小选择器来调整控件的宽度,如TextBox
上面的图像所示。
我知道method可以防止设计时的高度调整,但是我想要做的比那个解决方案要远一点,因为这个解决方案并没有删除那些大小选择器-- ...and只是让大小选择器在设计时可见是一种丑陋和混乱的行为。
我检查了官方的TextBox
类源代码以查看property value is changed,但没有看到任何相关的内容。
可能涉及分配给TextBox
类(System.Windows.Forms.Design.TextBoxBaseDesigner
)的TextBox
类,并且可能是谁在设计时决定了调整大小的行为?在这种情况下,我能做什么以及如何做?
发布于 2017-04-13 08:11:37
此行为由TextBoxBaseDesigner实现。也是RichTextBoxDesigner的基类,所以您可以很好地使用设计器。这里缺少的是AutoSize属性,RichTextBox隐藏它。当您将Multiline属性更改为False时,需要将其设置为True。设计器不能这样做,因为它是隐藏的,默认值是假的。
通过从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;
}
}
}
发布于 2017-04-13 07:29:43
这些值称为“大小句柄”,由与控件关联的设计器中的SelectionRules()
方法确定。需要记住的一点是,常规TextBox
的默认设置是MultiLine = False
,但对于RichTextBox
则相反。
在引用源中找不到任何相关内容的原因是因为System.Windows.Forms.Design.TextBoxDesigner
是internal
/ Friend
。还请注意,更改MultiLine
属性将导致重新创建控件(源中的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
结果:
https://stackoverflow.com/questions/43391459
复制相似问题