默认继承的按钮文本

时间:2019-06-17 13:25:42

标签: vb.net winforms windows-forms-designer

这是我继承的Button控件的代码:

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文件中,所以我尝试在控件的Designer视图/类中将Text设置为无效。< br /> 有时,重建后它甚至不会显示在工具箱中。

我只希望按钮的文本为空(因为它在设计器中定义了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在他的回答下方的评论中给了我这个主意,因此我添加了一个新的Property MyText,它的工作方式与我想要的一样(不确定为什么我需要致电{{1 }},但是,如果我不这样做,则会在失去焦点后进行更新):

Refresh

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

3 个答案:

答案 0 :(得分:2)

这就是WinForms设计器所做的。当您向表单添加控件时,它会根据控件的类型以及表单上具有默认名称的它们的数量来设置NameText属性。它是在构造函数执行后完成的,因此构造函数代码无济于事。您必须将代码放入属性本身,以忽略设计器中的集合:

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

请注意,这意味着您也无法自己进行设置,除非在运行时。

答案 1 :(得分:2)

简单方法:覆盖或阴影Text属性,添加一个DesignerSerializationVisibility属性,将其设置为 DesignerSerializationVisibility.Hidden ,将Browsable属性设置为{{1} }。

Designer不会为Text属性生成任何代码(因此Control将不会显示文本),该属性在PropertyGrid中不可见,但是它仍然存在并且可以在代码中进行设置。

False

另一种方法是使用自定义设计器删除属性。
请参阅此处如何实施:
Is it possible to change the value of a property attribute at design time?

答案 2 :(得分:2)

要实现您在已接受答案的评论中所述的目标,

  

...我希望保留Text属性,但只是将其保留为空...

您可以将ToolboxItemAttribute应用于自定义按钮类。

<System.ComponentModel.ToolboxItemAttribute(GetType(ToolBoxItemNoDefaultText))>
Public Class ButtonRefreshSmall

这将告诉设计环境使用类ToolBoxItemNoDefaultText来控制ButtonRefreshSmall的创建,以将其放置在设计图面上。 ToolBoxItemNoDefaultText将来自ToolboxItem Class

Imports System.Drawing.Design
Imports System.ComponentModel
Imports System.Runtime.Serialization
Imports System.Windows.Forms

<Serializable()> ' ToolBoxItems must be Serializable 
Public Class ToolBoxItemNoDefaultText : Inherits ToolboxItem
  Public Sub New(ByVal toolType As Type)
    ' this constructor is needed to allow the type decorated with 
    ' <System.ComponentModel.ToolboxItemAttribute(GetType(ToolBoxItemNoDefaultText))>
    ' to be added to the ToolBox
    MyBase.New(toolType)
  End Sub

  Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext)
    ' this constructor is needed to support the design-time deserialization of this
    ' class by the design environment.
    Deserialize(info, context)
  End Sub

  Protected Overrides Sub OnComponentsCreated(args As ToolboxComponentsCreatedEventArgs)
    ' this will run after all initialization code has run including that set
    ' by the component's designer, thus you can override designer set values.
    For Each comp As IComponent In args.Components
      Dim ctrl As Control = TryCast(comp, Control)
      If ctrl IsNot Nothing Then ctrl.Text = String.Empty
    Next
    MyBase.OnComponentsCreated(args)
  End Sub
End Class

该解决方案在某种程度上是事实,因为它允许运行默认设计器代码,然后修改创建的实例。您可能会注意到,设计者设置的Text在设置为String.Empty之前会暂时显示。

处理此问题的正确方法是创建一个自定义设计器,而不在初始化期间设置Text属性。但是,如果用户体验要尽可能接近MS实施的体验,则可能需要定制设计器的正确实施。