次の方法で共有


カスタム コントロールのデザイン時プロパティ

この記事では、Visual Studio の Windows フォーム ビジュアル デザイナーのコントロールに対してプロパティを処理する方法について説明します。

すべてのコントロールは、基底クラスの System.Windows.Forms.Controlから次のような多くのプロパティを継承します。

コントロールを作成するときに、新しいプロパティを定義し、デザイナーでの表示方法を制御できます。

プロパティを定義する

コントロールによって定義された get アクセサーを持つパブリック プロパティは、Visual Studio プロパティ ウィンドウに自動的に表示されます。 プロパティがアクセサー セットも定義している場合は、[プロパティ] ウィンドウ でプロパティを変更できます。 ただし、プロパティは、を適用することで、BrowsableAttribute ウィンドウで明示的に表示または非表示にすることができます。 この属性は、表示されるかどうかを示す 1 つのブール値パラメーターを受け取ります。 属性の詳細については、「属性 (C#)」または「属性の概要 (Visual Basic)」を参照してください。

[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public bool IsSelected { get; set; }
<Browsable(False)>
<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)>
Public Property IsSelected As Boolean

文字列との間で暗黙的に変換できない複合プロパティには、型コンバーターが必要です。

シリアル化されたプロパティ

コントロールに設定されたプロパティは、デザイナーのコードビハインド ファイルにシリアル化されます。 これは、プロパティの値が既定値以外に設定されている場合に発生します。

デザイナーは、プロパティの変更を検出すると、コントロールのすべてのプロパティを評価し、値がプロパティの既定値と一致しないプロパティをシリアル化します。 プロパティの値は、デザイナーのコード ファイド ファイルにシリアル化されます。 既定値は、シリアル化する必要があるプロパティ値をデザイナーが判断するのに役立ちます。

既定値

プロパティは、DefaultValueAttribute 属性を適用する場合、またはプロパティのクラスにプロパティ固有の Reset メソッドと ShouldSerialize メソッドが含まれている場合、既定値と見なされます。 属性の詳細については、「属性 (C#)」または「属性の概要 (Visual Basic)」を参照してください。

既定値を設定すると、次の機能が有効になります。

  • このプロパティは、既定値から変更された場合、プロパティ ウィンドウに視覚的な表示を提供します。
  • ユーザーは、プロパティを右クリックし、[ リセット] を選択して、プロパティを既定値に戻すことができます。
  • デザイナーは、より効率的なコードを生成します。

プロパティでプリミティブ型などの単純型を使用する場合は、プロパティに DefaultValueAttribute を適用することで既定値を設定できます。 ただし、この属性を持つプロパティは、その割り当てられた値で自動的に開始されません。 プロパティのバッキング フィールドを同じ既定値に設定する必要があります。 このプロパティは、宣言またはクラスのコンストラクターで設定できます。

プロパティが複合型の場合、またはデザイナーのリセットとシリアル化の動作を制御する場合は、クラスに Reset<PropertyName> メソッドと ShouldSerialize<PropertyName> メソッドを定義します。 たとえば、コントロールが Age プロパティを定義する場合、メソッドの名前は ResetAge および ShouldSerializeAgeです。

重要

プロパティに DefaultValueAttribute を適用するか、Reset<PropertyName> メソッドと ShouldSerialize<PropertyName> メソッドの両方を指定します。 既定値を定義する 2 つの方法を混在しないでください。

プロパティは、プロパティ ウィンドウでプロパティ名を右クリックして [リセット] を選択することで、デフォルト値に リセットできます。

プロパティ グリッドのコンテキストメニュー項目[リセット]をにします。

[プロパティ]>右クリック>[リセット] コンテキスト メニュー オプションが使用できるのは、次のときです。

  • プロパティには DefaultValueAttribute 属性が適用されており、プロパティの値が属性の値と一致しません。
  • プロパティのクラスは、Reset<PropertyName>を使用せずに ShouldSerialize<PropertyName> メソッドを定義します。
  • プロパティのクラスは Reset<PropertyName> メソッドを定義し、ShouldSerialize<PropertyName> は true を返します。

デフォルト値属性 (DefaultValueAttribute)

プロパティの値が DefaultValueAttributeによって提供される値と一致しない場合、プロパティは変更されたと見なされ、プロパティ ウィンドウでリセットできます。

重要

この属性は、対応する Reset<PropertyName> メソッドと ShouldSerialize<PropertyName> メソッドを持つプロパティでは使用しないでください。

次のコードでは、既定値が North の列挙体と、既定値が 10 の整数の 2 つのプロパティを宣言します。

[DefaultValue(typeof(Directions), "North")]
public Directions PointerDirection { get; set; } = Directions.North;

[DefaultValue(10)]
public int DistanceInFeet { get; set; } = 10;
<DefaultValue(GetType(Directions), "North")>
Public Property PointerDirection As Directions = Directions.North

<DefaultValue(10)>
Public Property DistanceInFeet As Integer = 10

Reset と ShouldSerialize

前述のように、Reset<PropertyName> メソッドと ShouldSerialize<PropertyName> メソッドは、プロパティのリセット動作だけでなく、値が変更され、デザイナーの分離コード ファイルにシリアル化される必要があるかどうかを判断する機会を提供します。 どちらの方法も連携して動作し、もう一方を定義せずに定義することはできません。

重要

Reset<PropertyName>を持つプロパティに対して、ShouldSerialize<PropertyName> メソッドと DefaultValueAttribute メソッドを作成しないでください。

Reset<PropertyName> が定義されている場合、[プロパティ] ウィンドウに、そのプロパティの [リセット] コンテキスト メニュー オプションが表示されます。 Reset が選択されると、Reset<PropertyName> メソッドが呼び出されます。 リセット コンテキスト メニュー オプションは、ShouldSerialize<PropertyName> メソッドから返されるものによって有効または無効になります。 ShouldSerialize<PropertyName>trueを返すと、プロパティが既定値から変更され、分離コード ファイルにシリアル化する必要があることを示し、リセット コンテキスト メニュー オプションを有効にします。 false が返されると、[リセット] コンテキスト メニュー オプションが無効になり、プロパティによって設定されたコードが分離コードから削除されます。

ヒント

どちらのメソッドも、コントロールのパブリック API を構成しないように、プライベート スコープで定義できます。また、定義する必要があります。

次のコード スニペットでは、Directionという名前のプロパティを宣言します。 このプロパティのデザイナー動作は、ResetDirection メソッドと ShouldSerializeDirection メソッドによって制御されます。

public Directions Direction { get; set; } = Directions.None;

private void ResetDirection() =>
    Direction = Directions.None;

private bool ShouldSerializeDirection() =>
    Direction != Directions.None;
Public Property Direction As Directions = Directions.None

Private Sub ResetDirection()
    Direction = Directions.None
End Sub

Private Function ShouldSerializeDirection() As Boolean
    Return Direction <> Directions.None
End Function

型変換器

型コンバーターは通常、ある型を別の型に変換しますが、プロパティ グリッドやその他のデザイン時コントロールに文字列から値への変換も提供します。 文字列から値への変換では、これらのデザイン時コントロールで複雑なプロパティを表すことができます。

ほとんどの組み込みデータ型 (数値、列挙型など) には、文字列から値への変換を提供し、検証チェックを実行する既定の型コンバーターがあります。 既定の型コンバーターは System.ComponentModel 名前空間にあり、変換される型の名前が付けられます。 コンバーターの型名は、次の形式を使用します: {type name}Converter。 たとえば、StringConverterTimeSpanConverterInt32Converterなどです。

型コンバーターは、デザイン時に Properties ウィンドウで広く使用されます。 型コンバーターは、TypeConverterAttributeを使用してプロパティまたは型に適用できます。

プロパティ ウィンドウでは、TypeConverterAttribute がプロパティで宣言されている場合、コンバーターを使用してプロパティを文字列値として表示します。 TypeConverterAttribute が型で宣言されている場合、プロパティ ウィンドウでは、その型のすべてのプロパティでコンバーターが使用されます。 型コンバーターは、デザイナーのコードビハインドファイルにおけるプロパティ値のシリアル化を支援します。

タイプエディター

プロパティ ウィンドウでは、プロパティの型が組み込み型または既知の型である場合、プロパティの型エディターが自動的に使用されます。 たとえば、ブール値は、TrueFalse 値を持つコンボ ボックスとして編集され、DateTime 型ではカレンダー ドロップダウンが使用されます。

重要

.NET Framework 以降、カスタム型エディターが変更されました。 詳細については、「 .NET Framework 以降のデザイナーの変更」を参照してください。