機能拡張を使用して WPF Designer for Visual Studio をカスタマイズするときに、カスタム コントロールを作成することがよくあります。 ユーザーが通常どおりにプロパティの値を設定できるようにすると同時に、コントロールのプロパティが実行時とデザイン時で異なる動作をするように設定する必要がある場合があります。 たとえば、ユーザーがコントロールの表示プロパティを false に設定できる場合でも、デザイン時にはそのコントロールを表示する必要があります。
このトピックでは、カスタム コントロールのプロパティのデザイン時動作を変更する手順について説明します。 一連の操作手順の詳細な例については、「チュートリアル : デザイン時のプロパティ動作の変更」を参照してください。
重要
この方法を使用した場合、デザイナー内でのプロパティの動作が、XAML ビュー内のプロパティの値と一致しません。 XAML ビューには、デザイン時にユーザーが入力した値が表示されます。 XAML ビュー内の値は、プロパティの実行時の動作を表します。
コントロールがデザイン時のものかどうかを判断し、その結果に応じてプロパティを設定する場合は、「方法 : カスタム コントロールがデザイン時のものか実行時のものかを判断する」を参照してください。
カスタム DesignModeValueProvider の作成
この手順では、カスタムの DesignModeValueProvider クラスを作成します。 TranslatePropertyValue メソッドで、変更するプロパティの新しい動作のカスタム ロジックを追加します。 この変更は、デザイナーにのみ影響します。 実行時には、プロパティはユーザーが設定したとおりに動作します。
カスタム DesignModeValueProvider を作成するには
プロジェクトで、次のアセンブリへの参照を追加します。
- Microsoft.Windows.Design.Extensibility
カスタム コントロール プロジェクトに新しいクラスを追加し、クラスを編集して、DesignModeValueProvider からの継承を指定します。 結果は次のようになります。
Public Class YourCustomDesignModeValueProvider Inherits Microsoft.Windows.Design.Model.DesignModeValueProvider End Class
class YourCustomDesignModeValueProvider : Microsoft.Windows.Design.Model.DesignModeValueProvider { }
クラスにコンストラクターを追加します。 コンストラクターで、キャプチャするプロパティを識別します。
Public Sub New() 'Properties.Add(<The Property To Change Goes Here>) 'More properties can go here. End Sub
public YourCustomDesignModeValueProvider() { //Properties.Add(<The Property To Change Goes Here>); //More properties can go here. }
クラスの TranslatePropertyValue メソッドをオーバーライドします。 ここで、デザイン時のプロパティの新しい動作を指定します。
Public Overrides Function TranslatePropertyValue( _ ByVal item As ModelItem, _ ByVal identifier As PropertyIdentifier, _ ByVal value As Object) As Object 'If identifier.Name = <Name of the property to change> Then ' ' Custom logic goes here. 'End If 'More custom logic for more properties can go here. Return MyBase.TranslatePropertyValue(item, identifier, value) End Function
public override object TranslatePropertyValue(ModelItem item, PropertyIdentifier identifier, object value) { //if (identifier.Name == <Name of the property to change>) //{ // Custom logic goes here. //} //More custom logic for more properties can go here. return base.TranslatePropertyValue(item, identifier, value); }
注意
この手順では、2 種類のプロパティを処理する 1 つの DesignModeValueProvider を作成します。 複数の DesignModeValueProvider オブジェクトを作成して、異なるプロパティを処理することもできます。
カスタム コントロールへの DesignModeValueProvider のアタッチ
この手順では、FeatureAttribute 属性を使用して、カスタム コントロールに DesignModeValueProvider をアタッチします。
カスタム コントロールに DesignModeValueProvider をアタッチするには
カスタム コントロールのクラス宣言を探します。 結果は次のようになります。
Public Class YourCustomControl
class YourCustomControl
クラス宣言に FeatureAttribute 属性を追加し、前の手順で作成した DesignModeValueProvider を指定します。
<Microsoft.Windows.Design.Features.Feature(GetType(YourCustomDesignModeValueProvider))> _ Public Class YourCustomControl
[Microsoft.Windows.Design.Features.Feature(typeof(YourCustomDesignModeValueProvider))] class YourCustomControl
注意
属性テーブルを提供することで、DesignModeValueProvider をカスタム コントロールにアタッチすることもできます。 詳細については、「デザイン時メタデータの提供」を参照してください。