簡體   English   中英

防止高度控制在設計時調整大小

[英]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.TextBoxDesignerinternal / 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM