Общие сведения о свойствах зависимости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.

Свойства зависимостей и свойства CLRDependency 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. Эти входные данные могут включать в себя системные свойства, такие как темы и пользовательские параметры, JIT-механизмы определения свойств, такие как привязка данных и анимации (раскадровки), шаблоны многократного использования, например ресурсы и стили, а также значения, известные благодаря отношениям между родительскими и дочерними элементами с другими элементами в дереве.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.

Свойства зависимостей поддерживают свойства CLRDependency 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.

  • Идентификатор свойства зависимостей. Экземпляр DependencyProperty, который получается в результате регистрации свойства зависимостей и затем сохраняется как статический член класса.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. Этот идентификатор используется в качестве параметра для многих API, взаимодействующих с системой свойств WPF.This identifier is used as a parameter for many of the APIs that interact with the WPF property system.

  • CLR-оболочка. Фактические реализации получения и задания свойства.CLR "wrapper": The actual get and set implementations for the property. Эти реализации включают идентификатор свойства зависимостей, используя его в вызовах GetValue и SetValue и, таким образом, обеспечивая поддержку для свойства с помощью системы свойств 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.

Задание значений свойств с помощью XAMLSetting property values in XAML

В следующем примере на XAML задается красный цвет фона кнопки.The following XAML example specifies the background color of a button as red. В этом примере показан случай, когда простое строковое значение атрибута на языке XAML преобразуется синтаксическим анализатором WPF XAML в тип WPF (Color посредством SolidColorBrush) в созданном коде.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

Установка значений свойств зависимостей в коде обычно осуществляется просто путем вызова реализации набора, предоставляемой оберткой CLR.Setting dependency property values in code is typically just a call to the set implementation exposed by the CLR "wrapper".

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

Получение значения свойства также является фактически вызовом реализации метода получения, имеющегося в "оболочке":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

Также можно вызывать API системы свойств GetValue и SetValue напрямую.You can also call the property system APIs GetValue and SetValue directly. Обычно это не требуется, если используются существующие свойства (оболочки более удобны и предоставляют лучшую раскрытие свойств для средств разработчика), но вызов интерфейсов API напрямую подходит для определенных сценариев.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 APIs directly is appropriate for certain scenarios.

Свойства можно задать на языке XAML, а затем использовать их в коде, с помощью кода программной части.Properties can be also set in XAML and then accessed later in code, through code-behind. Дополнительные сведения см. в разделе Код программной части и XAML в WPF.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.

В следующем примере свойство Content задается для Button с помощью привязки, объявленной в XAML.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) не предусмотрена собственная поддержка INotifyPropertyChanged для формирования уведомлений об изменениях в исходном значении свойства DependencyObject для операций привязки данных.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

Существует два основных направления применения свойств зависимостей — стили и шаблоны.Styles and templates are two of the chief motivating scenarios for using dependency properties. Стили особенно полезны для настройки свойств, определяющих приложение пользовательский интерфейсuser interface (UI).Styles are particularly useful for setting properties that define application пользовательский интерфейсuser interface (UI). Обычно стили определяются в XAML в качестве ресурсов.Styles are typically defined as resources in XAML. Стили взаимодействуют с системой свойств, так как они обычно содержат код для задания значения конкретного свойства, а также "правила срабатывания", которые определяют изменение значения свойства в зависимости от значения другого свойства в режиме реального времени.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. Метод задания в стиле задает для свойства Background элемента управления Button значение "зеленый".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.

АнимацииAnimations

Свойства зависимостей могут быть анимированы.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.

В следующем примере Background анимируется для свойства Button (с технической точки зрения Background анимируется с помощью синтаксиса элемента свойства для указания пустого SolidColorBrush в качестве Background, тогда свойство Color этого элемента SolidColorBrush — это свойство, которое непосредственно анимируется).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. Все последующие привязки в дочерних объектах не должны указывать источник: они могут использовать унаследованное значение из DataContext в родительском объекте StackPanel.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 или Source в Binding и намеренно не использовать унаследованное значение для контекста данных своих привязок.)(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.

Интеграция конструктора WPFWPF designer integration

Пользовательский элемент управления со свойствами, которые реализуются как свойства зависимостей, получит соответствующий конструктор WPF для поддержки Visual Studio.A custom control with properties that are implemented as dependency properties will receive appropriate WPF Designer for Visual Studio support. Один из примеров этого — возможность редактирования прямых и присоединенных свойств зависимостей с помощью окна Свойства.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, однако также указывается одна кнопка с локально заданным значением 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.

Фактически для первой кнопки свойство задано дважды, но применяется только одно значение, то, у которого наивысший приоритет.In principle, for the first button, the property is set twice, but only one value applies: the value with the highest precedence. Локально заданное значение имеет наивысший приоритет (исключение — выполняющаяся анимация, но анимаций нет в этом примере), поэтому вместо значения цвета фона первой кнопки, определенного стилем, используется локально заданное значение.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. Для второй кнопки не задано локальное значение (или другое значение с более высоким приоритетом, чем у стиля), поэтому цвет фона для этой кнопки определяется стилем.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. Как правило, свойства реализуются в виде свойств зависимостей только в тех случаях, когда возникает потребность поддерживать по крайней мере один из сценариев, реализуемых системой свойств (привязку данных, применение стилей, анимацию, поддержку значений по умолчанию, наследование, присоединенные свойства или проверку).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. Присоединенное свойство часто не имеет соответствия 1:1 со свойством среды CLR и не обязательно является свойством зависимостей.An attached property often does not have a 1:1 correspondence with a 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. Как правило, требуется разрешить дочерним элементам уведомлять родительский элемент о том, как они должны быть представлены в ИПUI (пример см. в разделе Dock или Left).One primary scenario is to enable child elements to inform the parent how they should be presented in ИПUI; 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