首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >防止高度控制在设计时调整大小

防止高度控制在设计时调整大小
EN

Stack Overflow用户
提问于 2017-04-13 11:46:13
回答 2查看 611关注 0票数 1

假想

当用户在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类,并且可能是谁在设计时决定了调整大小的行为?在这种情况下,我能做什么以及如何做?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-13 16:11:37

此行为由TextBoxBaseDesigner实现。也是RichTextBoxDesigner的基类,所以您可以很好地使用设计器。这里缺少的是AutoSize属性,RichTextBox隐藏它。当您将Multiline属性更改为False时,需要将其设置为True。设计器不能这样做,因为它是隐藏的,默认值是假的。

通过从RichTextBox派生您自己的类,这很容易修复:

代码语言:javascript
运行
复制
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;
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2017-04-13 15:29:43

这些值称为“大小句柄”,由与控件关联的设计器中的SelectionRules()方法确定。需要记住的一点是,常规TextBox的默认设置是MultiLine = False,但对于RichTextBox则相反。

在引用源中找不到任何相关内容的原因是因为System.Windows.Forms.Design.TextBoxDesignerinternal / Friend。还请注意,更改MultiLine属性将导致重新创建控件(源中的RecreateHandle();)。

代码语言:javascript
运行
复制
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

结果:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43391459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档