c# - 防止在设计时调整高度控件的大小

标签 c# .net vb.net visual-studio windows-forms-designer

场景

当用户将 TextBox 控件放在 WindowsForms 设计器上时,设计器仅显示两个大小选择器来调整控件的宽度:

enter image description here

...除非手动启用 TextBox.MultiLine 属性。

但是如果我们添加一个 RichTextBox,它会显示 8 个尺寸选择器:

enter image description here

...即使启用了 RichTextBox.MultiLine 属性。

问题

我想做的是将 RichTextBox 类子类化,以模仿 TextBox 在设计时默认具有的大小调整行为,这意味着防止高度/角如果 RichTextBox 不是多行,则调整大小。

确切地说,我想在设计时删除/隐藏高度和角尺寸选择器,因此子类 RichTextBox 应该只显示两个尺寸选择器来调整控件的宽度,就像上图中的 TextBox 一样。

我知道 the methodology to override SetBoundsCore method 以防止在设计时调整高度大小,但是我想比该解决方案走得更远一点,因为该解决方案不会删除那些尺寸选择器......只是让尺寸选择器可见是一个丑陋的以及设计时的困惑行为。

我检查了官方的 TextBox 类源代码以查看 what happens when the TextBox.MultiLine property value is changed ,但我没有看到任何相关内容。

可能涉及分配给 TextBox 类 (System.Windows.Forms.Design.TextBoxBaseDesigner) 的 DesignerAttribute() 类,并且可能是谁在设计时决定调整大小的行为?在那种情况下我可以做什么以及如何做?

最佳答案

这些被称为大小控制,由 SelectionRules() 决定与您的控件关联的设计器中的方法。要记住的一件事是常规 TextBox 的默认值是MultiLine = False但它与 RichTextBox 相反.

您在引用源中找不到任何相关内容的原因是 System.Windows.Forms.Design.TextBoxDesignerinternal/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

结果:

enter image description here

关于c# - 防止在设计时调整高度控件的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43391459/

相关文章:

c# - 如何从 AX 数据(容器)转换为 C# 集合

c# - 如何访问 new {int a, string b} 中的对象

c# - 检索 X509Certificate2 对象的颁发者

c# - 如何读取混合数据类型的excel?

vb.net - 将某些程序集转换为 VB.NET - SHR 运算符的工作方式不同?

c# - 将 Expression<Func<T1,bool>> 动态转换为 Expression<Func<T2,bool>

c# - 电源外壳 : Import-Module

c# - WIX如何打开自定义UI

vb.net - vb.net中使用后台工作程序进行多线程处理的最简单示例是什么

vb.net - 是否可以在控制台中更改整个背景颜色?