私が導き出した唯一の結論は、VSがコントロールの最初のインスタンスの「designer.vb」コードを生成し、ベースユーザーコントロールが変更されて再コンパイルされたとしても、その後は決して再生成しないということです。
これは正しい結論です。あなたは特に最初のコントロールのを白にするようにデザイナーに指示しました、そしてそれはプロパティを白に設定するコードをファイルBackColor
に挿入することによって従いました。これは無条件に行われるため、コントロールのデフォルトのプロパティが何であれオーバーライドされます。*.Designer.vb
BackColor
BackColor
コントロールのデフォルトBackColor
のプロパティを赤に変更すると、作成されるコントロールのすべての新しいインスタンスに影響します。これは、コントロールが引き続きデフォルトのプロパティ値を使用しているためです。ただし、そのプロパティの値を明示的にオーバーライドしたコントロールのインスタンスには影響しません。
この動作は直感的ではないように思われるかもしれませんが、実際には仕様によるものです。コントロールのすべてのインスタンスにデフォルトの背景色を継承させたい場合は、そのBackColor
個々のインスタンスにプロパティを設定しないでください。
コントロールの特定のインスタンスにデフォルトの背景色を使用させるには、明示的に設定した場合でも、プロパティウィンドウでプロパティを右クリックし、[リセット]を選択します。この場合、カスタムコントロールの最初のインスタンスの背景は、その特定のプロパティのデフォルト値を継承するため、赤に変わるはずです。
更新に応じて、問題は、さまざまなコントロールクラスが独自のデフォルト値を設定することです(親クラスからそれらをオーバーライドしますControl
)。カスタムコントロールの新しいデフォルトでそれらをオーバーライドする場合は、そのためのカスタムコントロールクラス内にコードを記述する必要があります。クラス全体ではなく、カスタムコントロールの特定のインスタンスにのみ影響するため、デザイナでこれを行うことはできません。
特にあなたがしなければならないことが2つあります。まず、関連するプロパティを上書きし、を使用してデフォルト値を設定しますDefaultValueAttribute
。次に、クラスのコンストラクターでプロパティのデフォルト値を設定します。
これは、デフォルトのコントロールから継承するカスタムコントロールの例ですLabel
。基本的にデフォルトでFlatStyle
プロパティを強制するすべての標準コントロールのバージョンがありFlatStyle.System
ます。コードはVB.NETで任意に使用できますが、C#が優先される方言であれば、簡単に変換できるはずです。
Imports System.Windows.Forms
Imports System.ComponentModel
Imports System.Drawing
<ToolboxItem(True)> <ToolboxBitmap(GetType(ResFinder), "LabelEx.bmp")> _
<Description("A standard Windows label control for displaying static text and images.")> _
Public Class LabelEx : Inherits Label
''' <summary>
''' Gets or sets the flat style appearance of this label control.
''' </summary>
<DefaultValue(GetType(System.Windows.Forms.FlatStyle), "System")> _
Public Shadows Property FlatStyle As FlatStyle
'Set the default flat style to System
Get
Return MyBase.FlatStyle
End Get
Set(ByVal value As FlatStyle)
MyBase.FlatStyle = value
End Set
End Property
''' <summary>
''' Initializes a new instance of the LabelEx" class with default settings.
''' </summary>
Public Sub New()
MyBase.New()
'Set default property values
Me.FlatStyle = FlatStyle.System
End Sub
End Class
この一般的な規則の唯一の主な例外は、コントロールのサイズまたはパディングのデフォルトを変更する場合です。この場合、保護されたプロパティDefaultSize
とDefaultPadding
プロパティをオーバーライドする必要があります。すなわち
''' <summary>
''' Gets the default Size of a ButtonEx control.
''' </summary>
Protected Overrides ReadOnly Property DefaultSize As Size
Get
Return New Size(88, 26)
End Get
End Property
''' <summary>
''' Gets the spacing, in pixels, around the image that is displayed on this button control.
''' </summary>
Protected Overrides ReadOnly Property DefaultPadding As Padding
Get
Return New Padding(7, 0, 0, 0)
End Get
End Property
この場合、コンストラクターでパブリックプロパティのデフォルト値を設定しないでください。
カスタムコントロール(およびいくつかの便利なコントロール!)を作成する方法の詳細については、WindowsフォームAeroライブラリを確認してください。