次の方法で共有


DesignModeValueProvider クラス

デザイナーでユーザーが行ったプロパティの変更をキャプチャし、デザイン時に新しい値を提供します。

継承階層

System.Object
  Microsoft.Windows.Design.Features.FeatureProvider
    Microsoft.Windows.Design.Model.DesignModeValueProvider

名前空間:  Microsoft.Windows.Design.Model
アセンブリ:  Microsoft.Windows.Design.Interaction (Microsoft.Windows.Design.Interaction.dll 内)

構文

'宣言
Public Class DesignModeValueProvider _
    Inherits FeatureProvider
public class DesignModeValueProvider : FeatureProvider
public ref class DesignModeValueProvider : public FeatureProvider
type DesignModeValueProvider =  
    class
        inherit FeatureProvider
    end
public class DesignModeValueProvider extends FeatureProvider

DesignModeValueProvider 型で公開されるメンバーは以下のとおりです。

コンストラクター

  名前 説明
パブリック メソッド DesignModeValueProvider DesignModeValueProvider クラスの新しいインスタンスを初期化します。

このページのトップへ

プロパティ

  名前 説明
パブリック プロパティ Properties キャプチャするプロパティのセットを取得します。

このページのトップへ

メソッド

  名前 説明
パブリック メソッド Equals 指定した Object が、現在の Object と等しいかどうかを判断します。 (Object から継承されます。)
プロテクト メソッド Finalize オブジェクトがガベージ コレクションにより収集される前に、そのオブジェクトがリソースを解放し、その他のクリーンアップ操作を実行できるようにします。 (Object から継承されます。)
パブリック メソッド GetHashCode 特定の型のハッシュ関数として機能します。 (Object から継承されます。)
パブリック メソッド GetType 現在のインスタンスの Type を取得します。 (Object から継承されます。)
プロテクト メソッド InvalidateProperty 指定されたプロパティを無効にします。
プロテクト メソッド MemberwiseClone 現在の Object の簡易コピーを作成します。 (Object から継承されます。)
パブリック メソッド ToString 現在のオブジェクトを表す文字列を返します。 (Object から継承されます。)
パブリック メソッド TranslatePropertyValue デザイナーでユーザーが行ったプロパティの変更をキャプチャし、デザイン時にカスタム ロジックを使用して新しい値を提供します。

このページのトップへ

解説

ユーザーがデザイナーでオブジェクトのプロパティ値を変更すると、通常、その値がデザイナー内のオブジェクトに設定されます。 DesignModeValueProvider クラスを使用すると、このプロセスに独自のロジックを挿入できます。 たとえば、ユーザーがコントロールの Visible プロパティを false に設定できるようにする一方で、デザイン時にはそのコントロールが引き続き表示されている必要がある場合があります。

これを実現するには、DesignModeValueProvider を作成して、カスタム コントロールにアタッチします。 DesignModeValueProvider がユーザーによって加えられたプロパティの変更をキャプチャし、TranslatePropertyValue メソッドに独自のロジックを挿入すると、DesignModeValueProvider が新しい値をデザイナーに渡します。

重要

この方法を使用した場合、デザイナー内でのプロパティの動作が、XAML ビュー内のプロパティの値と一致しません。 XAML ビューには、デザイン時にユーザーが入力した値が表示されます。 XAML ビュー内の値は、実行時にプロパティが示す動作を表します。

次の制限は、DesignModeValueProvider クラスを使用してデザイン時にプロパティ値を変更するときに適用されます。

  • デザイン時の値プロバイダーは、DependencyObject クラスから派生する型でのみ設定できます。

  • デザイン時の値プロバイダーは、依存関係プロパティでのみ設定できます。

  • DesignModeValueProvider 実装では、デザイン時の値は基本型プロパティで設定される必要があります。 特定の派生型を対象とする値プロバイダーを実装できます。 たとえば、Button クラスの Height プロパティの値プロバイダーを登録するのには、FrameworkElement クラスでそれを登録し、値プロバイダーの実装で対象の型をテストする必要があります。 詳細については、「チュートリアル : デザイン時のプロパティ動作の変更」を参照してください。

  • 値プロバイダーは、登録されている順序で実行されます。 プロパティに最後に登録された値プロバイダーは最後に実行されます。すべての値プロバイダーが実行されます。

  • 値プロバイダーの TranslatePropertyValue 実装が nullnull 参照 (Visual Basic では Nothing) を返す場合、プロパティのデザイン時の値は nullnull 参照 (Visual Basic では Nothing) に設定されます。

  • 値プロバイダーの TranslatePropertyValue 実装が静的な値 UnsetValue を返す場合、WPF デザイナー はプロパティで ClearValue メソッドを呼び出します。

注意

Silverlight コントロールに対して値プロバイダーを記述する場合は、WPF バージョンの UnsetValue を使用する必要があります。 これは、WPF デザイナー フレームワークの制限です。

  • 値プロバイダーを WPF 継承プロパティと共に使用することはできません。 たとえば、FlowDirection の値プロバイダーを登録すると、デザイン モードで期待どおりに動作しません。

  • プロパティ値がバインディングによって設定されている場合、値プロバイダーは計算値の代わりに Binding を返す必要があります。

  • いくつかの値プロバイダーは、デザイナーが特定のデザイン時の値に対するプロパティに特定のデザイン環境を確保するように強制するため、優先されないことがあります。 たとえば、フォント プロパティのカスタム値プロバイダーは、WPF デザイナー で期待どおりに動作しません。

  • TypeIdentifier を使用して値プロバイダーを登録すると、TranslatePropertyValue 実装に渡される型識別子がデザイン時メタデータで指定されているものと同じではない場合があります。 これは同等になりますが、同じインスタンスにはならない可能性があります。 値プロバイダーが型チェックを実行する場合は、プロパティ識別子の型コンポーネントを解決し、解決した型で型の等価性のテストを実行する必要があります。 通常、単にプロパティの名前を確認するだけですが、型に対してロジックを実行する必要がある場合は、型識別子を解決する必要があります。 ResolveType メソッドを使用して、正しい型を取得します。

  • WPF デザイナー フレームワークは、サポートされているいくつかの形式のいずれかで型識別子を渡すことができます。 値プロバイダーが型比較を実行する場合は、型識別子を実際の型に解決する必要があります。 ResolveType メソッドを使用して、正しい型を取得します。

カスタム ボタン コントロールにアタッチされるカスタム DesignModeValueProvider を作成する例を次に示します。 TranslatePropertyValue メソッドで、ButtonContent プロパティを変更して、デザイナーに大文字で表示されるようにします。 ButtonBackground プロパティも変更して、デザイナーに既定のシステム カラーで表示されるようにします。 これらの変更は、デザイナーにのみ影響します。 実行時には、Content プロパティおよび Background プロパティは、ユーザーが設定した値で表示されます。

詳細については、「チュートリアル : デザイン時のプロパティ動作の変更」を参照してください。



Imports System
Imports System.Windows                  'SystemColors
Imports System.Windows.Media            'SolidColorBrush
Imports System.Windows.Controls         'Button
Imports Microsoft.Windows.Design.Model  'DesignModeValueProvider
Imports Microsoft.Windows.Design.Metadata


Namespace CustomButton

    Public Class CustomButtonDesignModeValueProvider
        Inherits DesignModeValueProvider


        Public Sub New()
            Properties.Add(GetType(Button), "Content")
            Properties.Add(GetType(Button), "Background")
        End Sub



        Public Overrides Function TranslatePropertyValue( _
            ByVal item As ModelItem, _
            ByVal identifier As PropertyIdentifier, _
            ByVal value As Object) As Object

            If identifier.DeclaringType Is GetType(Button) And _
               identifier.Name = "Content" Then

                Return value.ToString().ToUpper()
            End If

            If identifier.DeclaringType Is GetType(Button) And _
               identifier.Name = "Background" Then

                Return New SolidColorBrush(SystemColors.ControlColor)
            End If

            Return MyBase.TranslatePropertyValue(item, identifier, value)
        End Function
    End Class
End Namespace


using System;
using System.Windows;                   //SystemColors
using System.Windows.Media;             //SolidColorBrush
using System.Windows.Controls;          //Button
using Microsoft.Windows.Design.Model;
using Microsoft.Windows.Design.Metadata;   //DesignModeValueProvider
namespace CustomButton
{
    class CustomButtonDesignModeValueProvider : DesignModeValueProvider
    {

        public CustomButtonDesignModeValueProvider()
        {
            Properties.Add( typeof(Button), "Content");
            Properties.Add(typeof(Button), "Background");
        }


        public override object TranslatePropertyValue(ModelItem item, PropertyIdentifier identifier, object value)
        {
            if (identifier.DeclaringType == typeof( Button ) &&
                identifier.Name == "Content" )
            {
                return ((string)value).ToUpper();
            }

            if (identifier.DeclaringType == typeof(Button) &&
                identifier.Name == "Background")
            {
                return new SolidColorBrush(SystemColors.ControlColor);
            }

            return base.TranslatePropertyValue(item, identifier, value);
        }
    }
}

スレッド セーフ

この型のすべてのパブリック static (Visual Basic では Shared) メンバーは、スレッド セーフです。 インスタンス メンバーの場合は、スレッド セーフであるとは限りません。

参照

参照

Microsoft.Windows.Design.Model 名前空間

その他の技術情報

方法 : プロパティの動作をデザイン時に変更する

WPF デザイナーの機能拡張アーキテクチャ

プロパティ編集アーキテクチャ

機能プロバイダーと機能コネクタ