继承默认按钮文本

3
这是我继承的按钮控件代码:
Public Class ButtonRefreshSmall
Inherits Button

Public Sub New()
    MyBase.New
    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.
    Me.SuspendLayout()
    Me.Text = ""
    MyBase.Text = ""
    Me.ResumeLayout()
End Sub
End Class

然而,当我重新生成并将此按钮拖到表单时,文本始终为“ButtonRefreshSmall1”。我尝试了没有“Inherits”声明的变体(因为它已经在“.Designer.vb”文件中),我尝试在控件的设计器视图/类中设置“Text”,但均无效。有时,在重新生成后甚至不会显示在工具箱中。
我想要的只是将按钮的文本留空(因为在设计器中定义了一个“Image”)。这是我在设计器文件中拥有的内容:
 <System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
    Me.SuspendLayout()
    '
    'ButtonRefreshSmall
    '
    Me.BackColor = System.Drawing.Color.Transparent
    Me.FlatAppearance.BorderSize = 0
    Me.FlatStyle = System.Windows.Forms.FlatStyle.Flat
    Me.Image = Global.TraxCashFlow.My.Resources.Resources.Refresh_grey_16x
    Me.Size = New System.Drawing.Size(23, 23)
    Me.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText
    Me.UseVisualStyleBackColor = False
    'MyBase.Text = ""
    Me.ResumeLayout(False)

End Sub

其他所有属性都像我设置的那样设置。我尝试使用TextImageRelation来欺骗它,但“B”总是可见的。

更新:Jimi在他的答案下面的评论中给了我这个想法,所以我添加了一个新的PropertyMyText,这正好符合我的要求(不确定为什么需要调用Refresh,如果我不这样做的话,在失去焦点后就会更新):

Imports System.ComponentModel

Public Class ButtonRefreshSmall

Public Property MyText As String
    Get
        Return Me.Text
    End Get
    Set(value As String)
        Me.Text = value
        Me.Refresh()
    End Set
End Property

Public Sub New()
    'MyBase.New
    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.
    'Me.Text = ""
End Sub

<Browsable(False)>
<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)>
Public Overrides Property Text As String
End Class

更新 #2,请参考 @TnTinMn 的答案。

拖动按钮后自己删除文本可能会更简单。 - the_lotus
如何防止WinForms设计器将Text属性设置为实例名称 - Reza Aghaei
3个回答

3
为了实现您在接受答案评论中所述的目标,您可以将ToolboxItemAttribute应用于您的自定义按钮类,这样可以使

请看我在问题里的最新更新。我认为这样更简单。 - okkko
@okkko,你可能会发现它更适合你的需求,但如果你将来再次需要这种行为,就需要复制你设计的整个代码模式,而不仅仅是添加ToolboxItemAttribute的一行额外代码。 - TnTinMn
你说得没错!其实以前我并没有真正看过你的代码,但现在试了一下,它完美地运行了,没有发现任何瞬间的问题。已点赞并接受为答案,抱歉 Jimi!我想对于简单问题来说有很多解决方案。 - okkko
1
以下是设计师的方法:如何防止WinForms设计器将Text属性设置为实例名称 - Reza Aghaei

2
那正是WinForms设计器所做的。当您向表单添加控件时,它会根据控件的类型和默认名称在表单上设置“Name”和“Text”属性。这是在构造函数执行后完成的,因此您的构造函数代码无法帮助。您需要在属性本身中放置代码以忽略设计器中的设置。"最初的回答"
Public Overrides Property Text As String
    Get
        Return MyBase.Text
    End Get
    Set
        If Not DesignMode Then
            MyBase.Text = Value
        End If
    End Set
End Property

请注意,这意味着您自己也无法设置它,除非在运行时进行设置。"最初的回答"

2
简单的方法:重写或隐藏Text属性,添加DesignerSerializationVisibility特性,将其设置为DesignerSerializationVisibility.Hidden,并将Browsable特性设置为False
设计程序不会为Text属性生成任何代码(因此控件不会显示文本),该属性在PropertyGrid中不可见,但仍然存在并且可以在代码中设置。
<Browsable(False)>
<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)>
Public Overrides Property Text As String
' or
' Public Shadows Property Text As String

另一种方法是使用自定义设计师来移除属性。
请参见此处如何实现:
在设计时更改属性特性的值是否可能?

这两个答案都很好,同时也是一种妥协。我想让Text属性保持不变,但是只要为空即可。对于这个特定的情况,我接受这个答案。 - okkko
1
正如我在我的答案中所说,您无论如何都无法在设计器中自己设置“Text”,因此在设计器中隐藏它是更好的选择。您仍然可以在代码中设置它,因为正如这个答案所说,该属性仍然存在。 - jmcilhinney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接