依存関係プロパティの概要Dependency properties overview

Windows Presentation Foundation (WPF) には、型のプロパティの機能を拡張するために使用できる一連のサービスが用意されています。Windows Presentation Foundation (WPF) provides a set of services that can be used to extend the functionality of a type's property. 通常、これらのサービスをまとめて WPF プロパティ システムと呼びます。Collectively, these services are typically referred to as the WPF property system. WPF プロパティ システムによって使用されるプロパティは、依存関係プロパティと呼ばれています。A property that is backed by the WPF property system is known as a dependency property. ここでは、WPF プロパティ システムと、依存関係プロパティの機能について説明します。This overview describes the WPF property system and the capabilities of a dependency property. この説明では、既存の依存関係プロパティを XAML およびコードで使用する方法を示します。This includes how to use existing dependency properties in XAML and in code. また、依存関係プロパティ メタデータなどの依存関係プロパティの特殊な側面や、カスタム クラスで独自の依存関係プロパティを作成する方法についても説明します。This overview also introduces specialized aspects of dependency properties, such as dependency property metadata, and how to create your own dependency property in a custom class.

必須コンポーネントPrerequisites

ここでは、.NET 型システムおよびオブジェクト指向プログラミングに関する基礎知識があることを前提にしています。This topic assumes that you have some basic knowledge of the .NET type system and object-oriented programming. このトピックの例について理解するには、XAML および WPF アプリケーションの記述方法について知っておく必要もあります。In order to follow the examples in this topic, you should also understand XAML and know how to write WPF applications. 詳細については、「チュートリアル:初めての WPF デスクトップ アプリケーションします。For more information, see Walkthrough: My first WPF desktop application.

依存関係プロパティおよび CLR プロパティDependency properties and CLR properties

WPF では通常、プロパティは通常、標準の .NET プロパティとして公開されます。In WPF, properties are typically exposed as standard .NET properties. 基本的なレベルでは、これらのプロパティと直接対話でき、これらのプロパティが依存関係として実装されることを認識することはありません。At a basic level, you could interact with these properties directly and never know that they are implemented as a dependency property. ただし、WPF プロパティ システムの一部またはすべての機能を利用できるように、これらの機能に精通しておく必要があります。However, you should become familiar with some or all of the features of the WPF property system, so that you can take advantage of these features.

依存関係プロパティの目的は、他の入力の値に基づいてプロパティの値を計算する方法を提供することです。The purpose of dependency properties is to provide a way to compute the value of a property based on the value of other inputs. 他の入力には、テーマやユーザー設定などのシステム プロパティ、データ バインディングやアニメーション/ストーリーボードなどのジャスト イン タイム プロパティ判定機構、リソースやスタイルなどの多目的のテンプレート、要素ツリー内の他の要素との親子のリレーションシップから判断される値などがあります。These other inputs might include system properties such as themes and user preference, just-in-time property determination mechanisms such as data binding and animations/storyboards, multiple-use templates such as resources and styles, or values known through parent-child relationships with other elements in the element tree. また、依存関係プロパティを実装して、自己完結型の検証、既定値、他のプロパティに対する変更を監視するコールバック、およびランタイム情報の可能性がある情報に基づいてプロパティ値を強制するシステムを提供できます。In addition, a dependency property can be implemented to provide self-contained validation, default values, callbacks that monitor changes to other properties, and a system that can coerce property values based on potentially runtime information. 既存のプロパティの実際の実装をオーバーライドしたり新しいプロパティを作成したりするのではなく、依存関係プロパティ メタデータをオーバーライドすることによって、派生クラスで既存のプロパティの特定の特性を変更することもできます。Derived classes can also change some specific characteristics of an existing property by overriding dependency property metadata, rather than overriding the actual implementation of existing properties or creating new properties.

SDK リファレンスで、プロパティのマネージド リファレンス ページの「依存関係プロパティの情報」セクションの有無によって、どのプロパティが依存関係プロパティかを特定できます。In the SDK reference, you can identify which property is a dependency property by the presence of the Dependency Property Information section on the managed reference page for that property. 「依存関係プロパティの情報」セクションにはその依存関係プロパティの DependencyProperty 識別子フィールドへのリンクがあり、そのプロパティに設定されるメタデータ オプションのリスト、クラスごとのオーバーライド情報、およびその他の詳細も示されています。The Dependency Property Information section includes a link to the DependencyProperty identifier field for that dependency property, and also includes a list of the metadata options that are set for that property, per-class override information, and other details.

依存関係プロパティによる CLR プロパティの補足Dependency properties back CLR properties

依存関係プロパティおよび WPF プロパティ システムは、プライベート フィールドでプロパティをサポートする標準パターンの代替実装として、プロパティをサポートする型を提供することによって、プロパティ機能を拡張します。Dependency properties and the WPF property system extend property functionality by providing a type that backs a property, as an alternative implementation to the standard pattern of backing the property with a private field. この型の名前は DependencyProperty です。The name of this type is DependencyProperty. WPF プロパティ システムを定義するその他の重要な型は DependencyObject です。The other important type that defines the WPF property system is DependencyObject. DependencyObject は、依存関係プロパティを登録および所有できる基本クラスを定義します。DependencyObject defines the base class that can register and own a dependency property.

依存関係プロパティで使用される用語を次に示します。The following lists the terminology that is used with dependency properties:

  • 依存関係プロパティ: によってサポートされるプロパティ、DependencyPropertyします。Dependency property: A property that is backed by a DependencyProperty.

  • 依存関係プロパティ識別子。 ADependencyProperty依存関係プロパティを登録するときに、戻り値として取得され、クラスの静的メンバーとして格納されているインスタンス。Dependency property identifier: A DependencyProperty instance, which is obtained as a return value when registering a dependency property, and then stored as a static member of a class. この識別子は、WPF プロパティ システムと対話する多くの API でパラメーターとして使用されます。This identifier is used as a parameter for many of the APIs that interact with the WPF property system.

  • CLR「ラッパー」: 実際の get および set プロパティの実装。CLR "wrapper": The actual get and set implementations for the property. これらの実装では、GetValueSetValue の呼び出しで使用することにより依存関係プロパティ識別子を組み込んで、WPF プロパティ システムを使用するプロパティを補助します。These implementations incorporate the dependency property identifier by using it in the GetValue and SetValue calls, thus providing the backing for the property using the WPF property system.

次の例では、IsSpinning 依存関係プロパティを定義し、DependencyProperty 識別子とサポートされるプロパティの関係を示します。The following example defines the IsSpinning dependency property, and shows the relationship of the DependencyProperty identifier to the property that it backs.

public static readonly DependencyProperty IsSpinningProperty = 
    DependencyProperty.Register(
    "IsSpinning", typeof(Boolean),
    typeof(MyCode)
    );
public bool IsSpinning
{
    get { return (bool)GetValue(IsSpinningProperty); }
    set { SetValue(IsSpinningProperty, value); }
}
Public Shared ReadOnly IsSpinningProperty As DependencyProperty =
    DependencyProperty.Register("IsSpinning",
                                GetType(Boolean),
                                GetType(MyCode))

Public Property IsSpinning() As Boolean
    Get
        Return CBool(GetValue(IsSpinningProperty))
    End Get
    Set(ByVal value As Boolean)
        SetValue(IsSpinningProperty, value)
    End Set
End Property

プロパティとそれを補足する DependencyProperty フィールドの名前付け規則は重要です。The naming convention of the property and its backing DependencyProperty field is important. フィールドの名前は常にプロパティの名前であり、サフィックス Property が追加されます。The name of the field is always the name of the property, with the suffix Property appended. この規則とその理由の詳細については、「カスタム依存関係プロパティ」を参照してください。For more information about this convention and the reasons for it, see Custom Dependency Properties.

プロパティ値の設定Setting property values

コードまたは XAML でプロパティを設定できます。You can set properties either in code or in XAML.

XAML でのプロパティ値の設定Setting property values in XAML

ボタンの背景色を赤に指定する方法を次の XAML の例に示します。The following XAML example specifies the background color of a button as red. この例では、生成されたコードで XAML 属性の単純な文字列値が WPF XAML パーサーによって WPF 型 (SolidColorBrush を使用したColor) に型変換される場合を示します。This example illustrates a case where the simple string value for a XAML attribute is type-converted by the WPF XAML parser into a WPF type (a Color, by way of a SolidColorBrush) in the generated code.

<Button Background="Red" Content="Button!"/>

XAML は、プロパティを設定するためのさまざまな構文形式をサポートします。XAML supports a variety of syntax forms for setting properties. 特定のプロパティに対してどの構文を使用するかは、プロパティで使用される値型、および型コンバーターの有無などのその他の要素によって決定されます。Which syntax to use for a particular property will depend on the value type that a property uses, as well as other factors such as the presence of a type converter. プロパティ設定の XAML 構文の詳細については、「XAML の概要 (WPF)」および「XAML 構文の詳細」を参照してください。For more information on XAML syntax for property setting, see XAML Overview (WPF) and XAML Syntax In Detail.

属性以外の構文の例として、別のボタンの背景を次の XAML の例に示します。As an example of non-attribute syntax, the following XAML example shows another button background. 今回は単純な純色を設定するのではなく、背景をイメージに設定し、そのイメージおよびそのイメージのソースを表す要素を、入れ子にした要素の属性として指定します。This time rather than setting a simple solid color, the background is set to an image, with an element representing that image and the source of that image specified as an attribute of the nested element. これは、プロパティ要素構文の例です。This is an example of property element syntax.

<Button Content="Button!">
  <Button.Background>
    <ImageBrush ImageSource="wavy.jpg"/>
  </Button.Background>
</Button>

コードでのプロパティの設定Setting properties in code

依存関係プロパティの値をコードで設定するには、通常、CLRCLR "ラッパー" によって公開される set 実装を呼び出すだけで済みます。Setting dependency property values in code is typically just a call to the set implementation exposed by the CLRCLR "wrapper".

Button myButton = new Button();
myButton.Width = 200.0;
Dim myButton As New Button()
myButton.Width = 200.0

プロパティ値を取得する場合も、基本的に get "ラッパー" 実装を呼び出します。Getting a property value is also essentially a call to the get "wrapper" implementation:

double whatWidth;
whatWidth = myButton.Width;
Dim whatWidth As Double
whatWidth = myButton.Width

プロパティ システムの APIAPIsGetValueSetValue は直接呼び出すことも可能です。You can also call the property system APIAPIs GetValue and SetValue directly. これは通常、既存のプロパティを使用する場合は不要ですが (ラッパーの方が便利で、開発者ツール用のより優れたプロパティが公開されます)、APIAPIs を直接呼び出す方法は、特定のシナリオに適しています。This is not typically necessary if you are using existing properties (the wrappers are more convenient, and provide better exposure of the property for developer tools), but calling the APIAPIs directly is appropriate for certain scenarios.

プロパティは、XAML で設定してから分離コードを介してコードでアクセスすることもできます。Properties can be also set in XAML and then accessed later in code, through code-behind. 詳細については、「WPF における分離コードと XAML」を参照してください。For details, see Code-Behind and XAML in WPF.

依存関係プロパティによって提供されるプロパティ機能Property functionality provided by a dependency property

依存関係プロパティは、フィールドによって補足されるプロパティとは対照的に、プロパティの機能を拡張する機能を提供します。A dependency property provides functionality that extends the functionality of a property as opposed to a property that is backed by a field. しばしば、そのような関数では、次の特定の機能を表すかサポートします。Often, such functionality represents or supports one of the following specific features:

リソースResources

依存関係プロパティの値は、リソースを参照することによって設定できます。A dependency property value can be set by referencing a resource. リソースは通常、ページのルート要素またはアプリケーションの Resources プロパティ値として指定されます (これらの場所を使用することが、リソースにアクセスするのに最も便利な方法です)。Resources are typically specified as the Resources property value of a page root element, or of the application (these locations enable the most convenient access to the resource). 次の例では、SolidColorBrush リソースを定義する方法を示します。The following example shows how to define a SolidColorBrush resource.

<DockPanel.Resources>
  <SolidColorBrush x:Key="MyBrush" Color="Gold"/>
</DockPanel.Resources>

リソースを定義すると、リソースを参照し、そのリソースを使用してプロパティ値を指定できるようになります。Once the resource is defined, you can reference the resource and use it to provide a property value:

<Button Background="{DynamicResource MyBrush}" Content="I am gold" />

この特定のリソースは、DynamicResource マークアップ拡張機能として参照されます (WPF XAML では、静的リソース参照または動的リソース参照を使用できます)。This particular resource is referenced as a DynamicResource Markup Extension (in WPF XAML, you can use either a static or dynamic resource reference). 動的リソース参照を使用するには、依存関係プロパティに設定している必要があるため、これは具体的には、WPF プロパティ システムによって有効になる動的リソース参照の使用方法になります。To use a dynamic resource reference, you must be setting to a dependency property, so it is specifically the dynamic resource reference usage that is enabled by the WPF property system. 詳しくは、「XAML リソース」を参照してください。For more information, see XAML Resources.

注意

リソースはローカル値として扱われます。つまり、別のローカル値を設定すると、リソース参照がなくなります。Resources are treated as a local value, which means that if you set another local value, you will eliminate the resource reference. 詳細については、「依存関係プロパティ値の優先順位」を参照してください。For more information, see Dependency Property Value Precedence.

データ バインディングData binding

依存関係プロパティは、データ バインディングを介して値を参照できます。A dependency property can reference a value through data binding. データ バインドは、XAML で特定のマークアップ拡張機能構文を介して機能するか、コードで Binding オブジェクトを介して機能します。Data binding works through a specific markup extension syntax in XAML, or the Binding object in code. データ バインディングを使用すると、プロパティ値の最終的な決定が、データ ソースから値が取得される実行時まで延期されます。With data binding, the final property value determination is deferred until run time, at which time the value is obtained from a data source.

次の例では、XAML で宣言されたバインディングを使用して、ButtonContent プロパティを設定します。The following example sets the Content property for a Button, using a binding declared in XAML. このバインディングは、継承されたデータ コンテキストと、XmlDataProvider データ ソース (ここでは示していません) を使用します。The binding uses an inherited data context and an XmlDataProvider data source (not shown). バインディング自体は、データ ソース内で XPath によって目的のソース プロパティを指定します。The binding itself specifies the desired source property by XPath within the data source.

<Button Content="{Binding XPath=Team/@TeamName}"/>

注意

バインディングはローカル値として扱われます。つまり、別のローカル値を設定すると、バインディングがなくなります。Bindings are treated as a local value, which means that if you set another local value, you will eliminate the binding. 詳細については、「依存関係プロパティ値の優先順位」を参照してください。For details, see Dependency Property Value Precedence.

依存関係プロパティまたは DependencyObject クラスは、データ バインディング操作用の DependencyObject ソース プロパティ値の変更通知を生成するための INotifyPropertyChanged は、ネイティブにはサポートしていません。Dependency properties, or the DependencyObject class, do not natively support INotifyPropertyChanged for purposes of producing notifications of changes in DependencyObject source property value for data binding operations. データ バインディング ターゲットに対する変更を報告できる、データ バインディングで使用するためのプロパティを作成する方法の詳細については、「データ バインドの概要」を参照してください。For more information on how to create properties for use in data binding that can report changes to a data binding target, see Data Binding Overview.

スタイルStyles

スタイルおよびテンプレートは、依存関係プロパティの使用に関する 2 つの主なシナリオです。Styles and templates are two of the chief motivating scenarios for using dependency properties. スタイルは、アプリケーションユーザー インターフェイス (UI)user interface (UI) を定義するプロパティを設定する際に特に役立ちます。Styles are particularly useful for setting properties that define application ユーザー インターフェイス (UI)user interface (UI). 通常、スタイルは XAML のリソースとして定義されます。Styles are typically defined as resources in XAML. スタイルには通常、特定のプロパティの "setter" および別のプロパティのリアルタイム値に基づいてプロパティ値を変更する "トリガー" が含まれるため、スタイルはプロパティ システムと対話します。Styles interact with the property system because they typically contain "setters" for particular properties, as well as "triggers" that change a property value based on the real-time value for another property.

次の例は、(表示されていない Resources ディクショナリ内に定義される) 非常に単純なスタイルを作成し、そのスタイルを直接 Style プロパティに Button 用に適用します。The following example creates a very simple style (which would be defined inside a Resources dictionary, not shown), then applies that style directly to the Style property for a Button. このスタイル内のセッターは、スタイル設定された ButtonBackground プロパティを緑色に設定します。The setter within the style sets the Background property for a styled Button to green.

<Style x:Key="GreenButtonStyle">
  <Setter Property="Control.Background" Value="Green"/>
</Style>
<Button Style="{StaticResource GreenButtonStyle}">I am green!</Button>

詳しくは、「 スタイルとテンプレート」をご覧ください。For more information, see Styling and Templating.

AnimationsAnimations

依存関係プロパティは、アニメーション化することができます。Dependency properties can be animated. アニメーションが適用されて実行されると、アニメーション化された値は、それ以外の場合のプロパティの値 (ローカル値など) よりも高い優先順位で動作します。When an animation is applied and is running, the animated value operates at a higher precedence than any value (such as a local value) that the property otherwise has.

次の例は、Button プロパティ上の Background をアニメーション化します (技術的には、空白の SolidColorBrushBackground として指定するために、プロパティ要素構文を使用して Background がアニメーション化されます。すると、その SolidColorBrushColor プロパティが直接アニメーション化されるプロパティになります)。The following example animates the Background on a Button property (technically, the Background is animated by using property element syntax to specify a blank SolidColorBrush as the Background, then the Color property of that SolidColorBrush is the property that is directly animated).

<Button>I am animated
  <Button.Background>
    <SolidColorBrush x:Name="AnimBrush"/>
  </Button.Background>
  <Button.Triggers>
    <EventTrigger RoutedEvent="Button.Loaded">
      <BeginStoryboard>
        <Storyboard>
          <ColorAnimation
            Storyboard.TargetName="AnimBrush" 
            Storyboard.TargetProperty="(SolidColorBrush.Color)"
            From="Red" To="Green" Duration="0:0:5" 
            AutoReverse="True" RepeatBehavior="Forever" />
        </Storyboard>
      </BeginStoryboard>
    </EventTrigger>
  </Button.Triggers>
</Button>

プロパティのアニメーション化の詳細については、「アニメーションの概要」および「ストーリーボードの概要」を参照してください。For more information on animating properties, see Animation Overview and Storyboards Overview.

メタデータのオーバーライドMetadata overrides

依存関係プロパティの特定の動作は、依存関係プロパティを最初に登録したクラスから派生させるときにプロパティのメタデータをオーバーライドすることで変更できます。You can change certain behaviors of a dependency property by overriding the metadata for that property when you derive from the class that originally registers the dependency property. メタデータのオーバーライドは、DependencyProperty 識別子に依存します。Overriding metadata relies on the DependencyProperty identifier. メタデータのオーバーライドでは、プロパティを再実装する必要はありません。Overriding metadata does not require re-implementing the property. メタデータの変更は、プロパティ システムでネイティブに処理されます。各クラスは、基本クラスから継承したすべてのプロパティに対して、型ごとに個別のメタデータを保持する可能性があります。The metadata change is handled natively by the property system; each class potentially holds individual metadata for all properties that are inherited from base classes, on a per-type basis.

次の例は、依存関係プロパティ DefaultStyleKey 用にメタデータをオーバーライドします。The following example overrides metadata for a dependency property DefaultStyleKey. この特定の依存関係プロパティ メタデータのオーバーライドは、テーマから既定のスタイルを使用できるコントロールを作成する実装パターンの一部です。Overriding this particular dependency property metadata is part of an implementation pattern that creates controls that can use default styles from themes.

public class SpinnerControl : ItemsControl
{
    static SpinnerControl()
    {
        DefaultStyleKeyProperty.OverrideMetadata(
            typeof(SpinnerControl), 
            new FrameworkPropertyMetadata(typeof(SpinnerControl))
        );
    }
}
Public Class SpinnerControl
    Inherits ItemsControl
    Shared Sub New()
        DefaultStyleKeyProperty.OverrideMetadata(GetType(SpinnerControl), New FrameworkPropertyMetadata(GetType(SpinnerControl)))
    End Sub
End Class

プロパティ メタデータをオーバーライドまたは取得する方法の詳細については、「依存関係プロパティのメタデータ」を参照してください。For more information about overriding or obtaining property metadata, see Dependency Property Metadata.

プロパティ値の継承Property value inheritance

要素は、オブジェクト ツリー内の親から依存関係プロパティの値を継承できます。An element can inherit the value of a dependency property from its parent in the object tree.

注意

プロパティ値の継承動作は、すべての依存関係プロパティにグローバルに有効にはなりません。これは、継承の計算時間がパフォーマンスに影響するからです。Property value inheritance behavior is not globally enabled for all dependency properties, because the calculation time for inheritance does have some performance impact. プロパティ値の継承は通常、特定のシナリオでプロパティ値の継承が適切であると示されるプロパティに対してのみ有効にします。Property value inheritance is typically only enabled for properties where a particular scenario suggests that property value inheritance is appropriate. SDK リファレンスで、依存関係プロパティの「依存関係プロパティの情報」セクションを調べて、依存関係プロパティで継承を行うかどうかを決定できます。You can determine whether a dependency property inherits by looking at the Dependency Property Information section for that dependency property in the SDK reference.

次の例ではバインディングを示し、前述のバインディングの例では示されていなかったバインディングのソースを指定する DataContext プロパティを設定します。The following example shows a binding, and sets the DataContext property that specifies the source of the binding, which was not shown in the earlier binding example. 子オブジェクト内の後続のいかなるバインディングでも、ソースを指定する必要はなく、親 StackPanel オブジェクトの DataContext から継承値を使用できます。Any subsequent bindings in child objects do not need to specify the source, they can use the inherited value from DataContext in the parent StackPanel object. (または、代わりに子オブジェクトが独自の DataContext または SourceBinding に指定するよう選択して、意図的に継承値をそのバインディング内のデータ コンテキストで使用しないようにできます)。(Alternatively, a child object could instead choose to directly specify its own DataContext or a Source in the Binding, and to deliberately not use the inherited value for data context of its bindings.)

<StackPanel Canvas.Top="50" DataContext="{Binding Source={StaticResource XmlTeamsSource}}">
  <Button Content="{Binding XPath=Team/@TeamName}"/>
</StackPanel>

詳細については、「プロパティ値の継承」を参照してください。For more information, see Property Value Inheritance.

WPF デザイナーの統合WPF designer integration

依存関係プロパティとして実装されるプロパティを使用するカスタム コントロールは、適切な WPF Designer for Visual StudioWPF Designer for Visual Studio のサポートを受けます。A custom control with properties that are implemented as dependency properties will receive appropriate WPF Designer for Visual StudioWPF Designer for Visual Studio support. 1 つの例として、[プロパティ] ウィンドウで、直接依存関係プロパティと添付依存関係プロパティを編集できる機能が挙げられます。One example is the ability to edit direct and attached dependency properties with the Properties window. 詳しくは、「コントロールの作成の概要」を参照してください。For more information, see Control Authoring Overview.

依存関係プロパティ値の優先順位Dependency property value precedence

依存関係プロパティの値を取得する場合、WPF プロパティ システムに関係する他のプロパティに基づく入力のいずれかを介して、そのプロパティに設定された値を取得する可能性があります。When you get the value of a dependency property, you are potentially obtaining a value that was set on that property through any one of the other property-based inputs that participate in the WPF property system. プロパティの値の取得方法に関するさまざまなシナリオが予測可能な方法で相互作用できるように、依存関係プロパティ値の優先順位が存在しています。Dependency property value precedence exists so that a variety of scenarios for how properties obtain their values can interact in a predictable way.

例を次に示します。Consider the following example. この例には、すべてのボタンとその Background プロパティに適用され、しかし次いで 1 つのボタンをローカルに設定されている Background値にも指定するスタイルが含まれています。The example includes a style that applies to all buttons and their Background properties, but then also specifies one button with a locally set Background value.

注意

SDK ドキュメントでは、依存関係プロパティについて説明するときに、"ローカル値" または "ローカルに設定された値" という用語が使用される場合があります。The SDK documentation uses the terms "local value" or "locally set value" occasionally when discussing dependency properties. ローカルに設定された値は、コードでオブジェクト インスタンスに直接設定されたプロパティ値または XAML で要素の属性として設定されたプロパティ値です。A locally set value is a property value that is set directly on an object instance in code, or as an attribute on an element in XAML.

原則として、最初のボタンではプロパティが 2 回設定されますが、適用される値は 1 つだけで、優先順位が最も高い値が適用されます。In principle, for the first button, the property is set twice, but only one value applies: the value with the highest precedence. ローカルに設定された値の優先順位が最も高いため (実行中のアニメーションを除きますが、この例ではアニメーションは適用されていません)、最初のボタンの背景に対するスタイル setter の値ではなくローカルに設定された値が使用されます。A locally set value has the highest precedence (except for a running animation, but no animation applies in this example) and thus the locally set value is used instead of the style setter value for the background on the first button. 2 番目のボタンにはローカル値が設定されていないため (また、優先順位がスタイル setter より高い値が他にないため)、そのボタンの背景はスタイル setter に基づきます。The second button has no local value (and no other value with higher precedence than a style setter) and thus the background in that button comes from the style setter.

<StackPanel>
  <StackPanel.Resources>
    <Style x:Key="{x:Type Button}" TargetType="{x:Type Button}">
     <Setter Property="Background" Value="Red"/>
    </Style>
  </StackPanel.Resources>
  <Button Background="Green">I am NOT red!</Button>
  <Button>I am styled red</Button>
</StackPanel>

依存関係プロパティの優先順位が存在する理由Why does dependency property precedence exist?

通常、スタイルを常に適用し、個別の要素のローカルに設定された値を無効にすることは望ましくありません (また、一般に、スタイルまたは要素の使用は非常に困難です)。Typically, you would not want styles to always apply and to obscure even a locally set value of an individual element (otherwise, it would be very difficult to use either styles or elements in general). そのため、スタイルに基づく値は、ローカルに設定された値よりも低い優先順位で動作します。Therefore, the values that come from styles operate at a lower precedent than a locally set value. 依存関係プロパティの詳細なリストおよび依存関係プロパティの有効値を決める要因については、「依存関係プロパティ値の優先順位」を参照してください。For a more thorough listing of dependency properties and where a dependency property effective value might come from, see Dependency Property Value Precedence.

注意

WPF 要素で定義されるプロパティには、依存関係プロパティではないものが多数あります。There are a number of properties defined on WPF elements that are not dependency properties. 概してプロパティは、プロパティ システムによって可能になる 1 つ以上のシナリオ (データ バインディング、スタイル設定、アニメーション、既定値のサポート、継承、添付プロパティ、または無効化) をサポートする必要がある場合にのみ依存関係プロパティとして実装されます。By and large, properties were implemented as dependency properties only when there were needs to support at least one of the scenarios enabled by the property system: data binding, styling, animation, default value support, inheritance, attached properties, or invalidation.

依存関係プロパティの詳細情報Learning more about dependency properties

  • 添付プロパティは、XAML で特殊な構文をサポートするプロパティの一種です。An attached property is a type of property that supports a specialized syntax in XAML. 多くの場合、添付プロパティは共通言語ランタイム (CLR)common language runtime (CLR) プロパティとは 1 対 1 で対応せず、依存関係プロパティであるとは限りません。An attached property often does not have a 1:1 correspondence with a 共通言語ランタイム (CLR)common language runtime (CLR) property, and is not necessarily a dependency property. 添付プロパティの一般的な目的は、親要素と子要素がどちらも、クラス メンバー リストの一部としてそのプロパティを処理しない場合でも、子要素が親要素にプロパティ値を報告できるようにすることです。The typical purpose of a attached property is to allow child elements to report property values to a parent element, even if the parent element and child element do not both possess that property as part of the class members listings. 1 つの主要なシナリオは、UIUI でどのように表示するかを、子要素を有効にして親に通知します。例については、「Dock」または「Left」を参照してください。One primary scenario is to enable child elements to inform the parent how they should be presented in UIUI; for an example, see Dock or Left. 詳細については、「添付プロパティの概要」を参照してください。For details, see Attached Properties Overview.

  • コンポーネントまたはアプリケーションの開発者は、データ バインディングやスタイルのサポートなどの機能を有効にするために、または無効化および値の強制のサポートのために、独自の依存関係プロパティを作成できます。Component developers or application developers may wish to create their own dependency property, in order to enable capabilities such as data binding or styles support, or for invalidation and value coercion support. 詳細については、「カスタム依存関係プロパティ」を参照してください。For details, see Custom Dependency Properties.

  • 依存関係プロパティは通常、インスタンスにアクセスできる呼び出し元がアクセス可能か、少なくとも検出可能なパブリック プロパティと見なされます。Dependency properties should generally be considered to be public properties, accessible or at least discoverable by any caller that has access to an instance. 詳細については、「依存関係プロパティのセキュリティ」を参照してください。For more information, see Dependency Property Security.

関連項目See also