Visão geral das propriedades de dependênciaDependency properties overview

O WPF (Windows Presentation Foundation) fornece um conjunto de serviços que podem ser usados para estender a funcionalidade de uma propriedade de um tipo.Windows Presentation Foundation (WPF) provides a set of services that can be used to extend the functionality of a type's property. Em conjunto, esses serviços são normalmente conhecidos como o sistema de propriedades do WPF.Collectively, these services are typically referred to as the WPF property system. Uma propriedade que tem o suporte do sistema de propriedades do WPF é conhecida como uma propriedade de dependência.A property that is backed by the WPF property system is known as a dependency property. Esta visão geral descreve o sistema de propriedades do WPF e as funcionalidades de uma propriedade de dependência.This overview describes the WPF property system and the capabilities of a dependency property. Isso inclui como usar as propriedades de dependência existentes no XAML e no código.This includes how to use existing dependency properties in XAML and in code. Esta visão geral também apresenta aspectos especializados de propriedades de dependência, como metadados de propriedades de dependência e como criar sua própria propriedade de dependência em uma classe personalizada.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.

PrerequisitesPrerequisites

Este tópico pressupõe que você tenha algum conhecimento básico sobre o sistema de tipos .NET e sobre programação orientada a objeto.This topic assumes that you have some basic knowledge of the .NET type system and object-oriented programming. Para seguir os exemplos deste tópico, você também deve ter noções básicas de XAML e saber como escrever aplicativos do WPF.In order to follow the examples in this topic, you should also understand XAML and know how to write WPF applications. Para obter mais informações, confira Passo a passo: Meu primeiro aplicativo de área de trabalho do WPF.For more information, see Walkthrough: My first WPF desktop application.

Propriedades de dependência e propriedades CLRDependency properties and CLR properties

No WPF, as propriedades normalmente são expostas como propriedades padrão do .NET.In WPF, properties are typically exposed as standard .NET properties. Em um nível básico, você poderá interagir com essas propriedades diretamente e nunca saber que elas são implementadas como uma propriedade de dependência.At a basic level, you could interact with these properties directly and never know that they are implemented as a dependency property. No entanto, você deve se familiarizar com algumas ou todas as funcionalidades do sistema de propriedades do WPF para poder aproveitá-las.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.

A finalidade das propriedades de dependência é fornecer uma maneira para calcular o valor de uma propriedade com base no valor de outras entradas.The purpose of dependency properties is to provide a way to compute the value of a property based on the value of other inputs. Essas outras entradas podem incluir propriedades do sistema, como temas e preferências do usuário, mecanismos de determinação de propriedade Just-In-Time, como vinculação de dados e animações/storyboards, uso múltiplo de modelos, como recursos e estilos ou valores conhecidos por meio de relacionamentos pai-filho com outros elementos da árvore de elementos.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. Além disso, uma propriedade de dependência pode ser implementada para fornecer validação independente, valores padrão, retornos de chamada que monitoram alterações em outras propriedades e um sistema que pode impor valores da propriedade com base nas informações possivelmente em runtime.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. As classes derivadas também podem alterar algumas características específicas de uma propriedade existente, substituindo metadados de propriedades de dependência, em vez de substituir a implementação real das propriedades existentes ou criar novas propriedades.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.

Na referência do SDK, você pode identificar qual propriedade é uma propriedade de dependência pela presença da seção Informações sobre a propriedade de dependência na página de referência gerenciada dessa propriedade.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. A seção Informações sobre a propriedade de dependência inclui um link para o campo de identificador DependencyProperty da propriedade de dependência e também inclui uma lista das opções de metadados definidas para essa propriedade, informações de substituição por classe e outros detalhes.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.

As propriedades de dependência dão suporte às propriedades CLRDependency properties back CLR properties

As propriedades de dependência e o sistema de propriedades do WPF estendem a funcionalidade da propriedade fornecendo um tipo que dá suporte a uma propriedade, como uma implementação alternativa ao padrão de suporte da propriedade com um campo particular.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. O nome desse tipo é DependencyProperty.The name of this type is DependencyProperty. O outro tipo importante que define o sistema de propriedades do WPF é DependencyObject.The other important type that defines the WPF property system is DependencyObject. DependencyObject define a classe base que pode registrar e ter uma propriedade de dependência.DependencyObject defines the base class that can register and own a dependency property.

A seguinte lista relaciona a terminologia usada com propriedades de dependência:The following lists the terminology that is used with dependency properties:

  • Propriedade de dependência: uma propriedade que tem o suporte de uma DependencyProperty.Dependency property: A property that is backed by a DependencyProperty.

  • Identificador de propriedade de dependência: uma instância de DependencyProperty, que é obtida como um valor retornado durante o registro de uma propriedade de dependência e, em seguida, armazenada como um membro estático de uma classe.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. Esse identificador é usado como um parâmetro para muitas das APIs que interagem com o sistema de propriedades do WPF.This identifier is used as a parameter for many of the APIs that interact with the WPF property system.

  • “Wrapper” CLR: as implementações reais get e set da propriedade.CLR "wrapper": The actual get and set implementations for the property. Essas implementações incorporam o identificador de propriedade de dependência com seu uso em chamadas GetValue e SetValue, fornecendo o suporte para a propriedade usando o sistema de propriedades do 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.

O exemplo a seguir define a propriedade de dependência IsSpinning e mostra a relação entre o identificador DependencyProperty e a propriedade à qual ele dá suporte.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

A convenção de nomenclatura da propriedade e de seu campo DependencyProperty de suporte é importante.The naming convention of the property and its backing DependencyProperty field is important. O nome do campo é sempre o nome da propriedade, com o sufixo Property acrescentado.The name of the field is always the name of the property, with the suffix Property appended. Para obter mais informações sobre essa convenção e as razões para seu uso, consulte Propriedades de dependência personalizadas.For more information about this convention and the reasons for it, see Custom Dependency Properties.

Configurando valores da propriedadeSetting property values

É possível definir propriedades no código ou em XAML.You can set properties either in code or in XAML.

Configurando valores da propriedade em XAMLSetting property values in XAML

O exemplo de XAML a seguir especifica a cor da tela de fundo de um botão como vermelho.The following XAML example specifies the background color of a button as red. Este exemplo ilustra um caso em que o valor de cadeia de caracteres simples para um atributo XAML é o tipo convertido pelo analisador XAML do WPF em um tipo WPF (uma Color, por meio de um SolidColorBrush) no código gerado.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!"/>

O XAML dá suporte a uma variedade de formatos de sintaxe para a configuração de propriedades.XAML supports a variety of syntax forms for setting properties. A sintaxe a ser usada para determinada propriedade dependerá do tipo de valor usado por uma propriedade, bem como outros fatores, como a presença de um conversor de tipo.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. Para obter mais informações sobre a sintaxe do XAML para a configuração de propriedades, consulte Visão geral do XAML (WPF) e Sintaxe do XAML em detalhes.For more information on XAML syntax for property setting, see XAML Overview (WPF) and XAML Syntax In Detail.

Como um exemplo de sintaxe não atributo, o exemplo de XAML a seguir mostra outra tela de fundo do botão.As an example of non-attribute syntax, the following XAML example shows another button background. Desta vez, em vez de configurar uma cor sólida simples, a tela de fundo é definida como uma imagem, com um elemento que representa a imagem e a origem dessa imagem especificada como um atributo do elemento aninhado.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. Este é um exemplo de sintaxe de elemento de propriedade.This is an example of property element syntax.

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

Configurando propriedades no códigoSetting properties in code

A definição de valores de propriedade de dependência no código normalmente é apenas uma chamada para a implementação do conjunto exposta pelo "wrapper" do 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

Obter um valor da propriedade também é basicamente uma chamada à implementação get do “wrapper”: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

Você também pode chamar as APIs do sistema de propriedades GetValue e SetValue diretamente.You can also call the property system APIs GetValue and SetValue directly. Isso normalmente não é necessário se você estiver usando propriedades existentes (os wrappers são mais convenientes e fornece uma melhor exposição da propriedade para ferramentas de desenvolvedor), mas chamar as APIs diretamente é apropriado para determinados cenários.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.

As propriedades também podem ser definidas em XAML e, em seguida, acessadas no código posteriormente, por meio do code-behind.Properties can be also set in XAML and then accessed later in code, through code-behind. Para obter detalhes, consulte Code-behind e XAML no WPF.For details, see Code-Behind and XAML in WPF.

Funcionalidade de propriedade fornecida por uma propriedade de dependênciaProperty functionality provided by a dependency property

Uma propriedade de dependência fornece uma funcionalidade que estende a funcionalidade de uma propriedade, em vez de uma propriedade que tem o suporte de um campo.A dependency property provides functionality that extends the functionality of a property as opposed to a property that is backed by a field. Normalmente, essa funcionalidade representa ou dá suporte a uma das seguintes funcionalidades específicas:Often, such functionality represents or supports one of the following specific features:

RecursosResources

Um valor da propriedade de dependência pode ser definido com uma referência a um recurso.A dependency property value can be set by referencing a resource. Normalmente, os recursos são especificados com o valor da propriedade Resources de um elemento raiz da página ou do aplicativo (essas localizações permitem o acesso mais conveniente ao recurso).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). O exemplo a seguir mostra como definir um recurso SolidColorBrush.The following example shows how to define a SolidColorBrush resource.

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

Depois de definir o recurso, você pode referenciar o recurso e usá-lo para fornecer um valor da propriedade: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" />

Esse recurso específico é referenciado como uma Extensão de Marcação de DynamicResource (no XAML do WPF, é possível usar uma referência de recurso estático ou dinâmico).This particular resource is referenced as a DynamicResource Markup Extension (in WPF XAML, you can use either a static or dynamic resource reference). Para usar uma referência de recurso dinâmico, é necessário fazer a definição para uma propriedade de dependência e, portanto, é especificamente o uso da referência de recurso dinâmico que é habilitado pelo sistema de propriedades do 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. Para obter mais informações, consulte Recursos XAML.For more information, see XAML Resources.

Observação

Os recursos serão tratados como um valor local, o que significa que, se você definir outro valor local, eliminará a referência do recurso.Resources are treated as a local value, which means that if you set another local value, you will eliminate the resource reference. Para obter mais informações, consulte Precedência do valor da propriedade de dependência.For more information, see Dependency Property Value Precedence.

Associação de dadosData binding

Uma propriedade de dependência pode referenciar um valor por meio da vinculação de dados.A dependency property can reference a value through data binding. A associação de dados funciona por meio de uma sintaxe de extensão de marcação específica em XAML ou pelo objeto Binding no código.Data binding works through a specific markup extension syntax in XAML, or the Binding object in code. Com a vinculação de dados, a determinação do valor da propriedade final é adiada até o tempo de execução, no qual o valor é obtido de uma fonte de dados.With data binding, the final property value determination is deferred until run time, at which time the value is obtained from a data source.

O exemplo a seguir define a propriedade Content de um Button, usando uma associação declarada em XAML.The following example sets the Content property for a Button, using a binding declared in XAML. A associação usa um contexto de dados herdado e uma fonte de dados XmlDataProvider (não mostrada).The binding uses an inherited data context and an XmlDataProvider data source (not shown). A própria associação especifica a propriedade de origem desejada por XPath na fonte de dados.The binding itself specifies the desired source property by XPath within the data source.

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

Observação

As associações serão tratadas como um valor local, o que significa que, se você definir outro valor local, eliminará a associação.Bindings are treated as a local value, which means that if you set another local value, you will eliminate the binding. Para obter mais detalhes, consulte Precedência do valor da propriedade da dependência.For details, see Dependency Property Value Precedence.

As propriedades de dependência, ou a classe DependencyObject, não dão suporte nativo a INotifyPropertyChanged para fins de produção de notificações de alterações no valor da propriedade de origem DependencyObject em operações de associação de dados.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. Para obter mais informações sobre como criar propriedades para uso na vinculação de dados que podem relatar alterações para um destino de vinculação de dados, consulte Visão geral da vinculação de dados.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.

EstilosStyles

Estilos e modelos são dois dos principais cenários que motivam o uso de propriedades de dependência.Styles and templates are two of the chief motivating scenarios for using dependency properties. Os estilos são particularmente úteis para a configuração de propriedades que definem a UI (interface do usuário)user interface (UI) do aplicativo.Styles are particularly useful for setting properties that define application UI (interface do usuário)user interface (UI). Normalmente, os estilos são definidos como recursos no XAML.Styles are typically defined as resources in XAML. Os estilos interagem com o sistema de propriedades porque geralmente contêm “setters” para propriedades específicas, bem como “gatilhos” que alteram um valor da propriedade com base no valor em tempo real de outra propriedade.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.

O exemplo a seguir cria um estilo muito simples (que é definido em um dicionário Resources, não mostrado) e, em seguida, aplica esse estilo diretamente à propriedade Style de um 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. O setter no estilo define a propriedade Background de um Button com estilo como verde.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>

Para obter mais informações, consulte Estilo e modelagem.For more information, see Styling and Templating.

AnimationsAnimations

As propriedades de dependência podem ser animadas.Dependency properties can be animated. Quando uma animação é aplicada e está em execução, o valor animado opera com uma precedência maior do que qualquer valor (como um valor local) que a propriedade, de outro modo, tem.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.

O exemplo a seguir anima a Background em uma propriedade Button (tecnicamente, a Background é animada usando a sintaxe de elemento de propriedade para especificar um SolidColorBrush em branco como a Background e, em seguida, a propriedade Color desse SolidColorBrush é a propriedade animada diretamente).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>

Para obter mais informações sobre como animar propriedades, consulte Visão geral da animação e Visão geral dos storyboards.For more information on animating properties, see Animation Overview and Storyboards Overview.

Substituições de metadadosMetadata overrides

É possível alterar alguns comportamentos de uma propriedade de dependência substituindo os metadados dessa propriedade ao derivar da classe que originalmente registra a propriedade de dependência.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. A substituição dos metadados depende do identificador DependencyProperty.Overriding metadata relies on the DependencyProperty identifier. Sobrescrever metadados não exige a reimplementação da propriedade.Overriding metadata does not require re-implementing the property. A alteração de metadados é tratada nativamente pelo sistema de propriedades; cada classe potencialmente contém metadados individuais para todas as propriedades que são herdadas de classes base por tipo.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.

O exemplo a seguir substitui os metadados de uma propriedade de dependência DefaultStyleKey.The following example overrides metadata for a dependency property DefaultStyleKey. A substituição dos metadados dessa propriedade de dependência específica faz parte de um padrão de implementação que cria controles que podem usar estilos padrão de temas.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

Para obter mais informações sobre como substituir ou obter metadados de propriedades, consulte Metadados de propriedades de dependência.For more information about overriding or obtaining property metadata, see Dependency Property Metadata.

Herança do valor de propriedadeProperty value inheritance

Um elemento pode herdar o valor de uma propriedade de dependência de seu pai na árvore de objetos.An element can inherit the value of a dependency property from its parent in the object tree.

Observação

O comportamento de herança do valor da propriedade não está habilitado globalmente em todas as propriedades de dependência, pois o tempo de cálculo da herança causa algum impacto de desempenho.Property value inheritance behavior is not globally enabled for all dependency properties, because the calculation time for inheritance does have some performance impact. A herança do valor da propriedade normalmente é habilitada apenas em propriedades nas quais um cenário específico sugere que a herança do valor da propriedade é apropriada.Property value inheritance is typically only enabled for properties where a particular scenario suggests that property value inheritance is appropriate. Você pode determinar se uma propriedade de dependência tem herança examinando a seção Informações da propriedade de dependência dessa propriedade de dependência na referência do 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.

O exemplo a seguir mostra uma associação e define a propriedade DataContext que especifica a origem da associação, que não foi mostrada no exemplo de associação anterior.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. As associações seguintes nos objetos filho não precisam especificar a origem; elas podem usar o valor herdado do DataContext no objeto StackPanel pai.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. (Como alternativa, um objeto filho pode optar por especificar diretamente seu próprio DataContext ou uma Source na Binding e deliberadamente não usar o valor herdado para o contexto de dados de suas associações.)(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>

Para obter mais informações, consulte Herança do valor da propriedade.For more information, see Property Value Inheritance.

Integração com o WPF DesignerWPF designer integration

Um controle personalizado com propriedades que são implementadas como propriedades de dependência receberá o designer do WPF apropriado para suporte ao Visual Studio.A custom control with properties that are implemented as dependency properties will receive appropriate WPF Designer for Visual Studio support. Um exemplo é a capacidade de editar propriedades de dependência diretas e anexadas com a janela Propriedades.One example is the ability to edit direct and attached dependency properties with the Properties window. Para obter mais informações, consulte Visão geral da criação de controle.For more information, see Control Authoring Overview.

Precedência do valor da propriedade de dependênciaDependency property value precedence

Ao obter o valor de uma propriedade de dependência, possivelmente, você está obtendo um valor que foi definido nessa propriedade por meio de uma das outras entradas baseadas em propriedade que participam do sistema de propriedades do 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. A precedência do valor da propriedade de dependência existe para que uma variedade de cenários de como as propriedades obtêm seus valores possam interagir de forma previsível.Dependency property value precedence exists so that a variety of scenarios for how properties obtain their values can interact in a predictable way.

Considere o exemplo a seguir.Consider the following example. O exemplo inclui um estilo que se aplica a todos os botões e suas propriedades Background, mas, em seguida, especifica também um botão com um valor Background definido localmente.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.

Observação

A documentação do SDK usa os termos “valor local” ou “valor definido localmente” ocasionalmente quando trata de propriedades de dependência.The SDK documentation uses the terms "local value" or "locally set value" occasionally when discussing dependency properties. Um valor definido localmente é um valor da propriedade definido diretamente em uma instância de objeto no código ou como um atributo em um elemento no 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.

Em princípio, no primeiro botão, a propriedade é definida duas vezes, mas apenas um valor é aplicado: o valor com a precedência mais alta.In principle, for the first button, the property is set twice, but only one value applies: the value with the highest precedence. Um valor definido localmente tem a precedência mais alta (exceto em uma animação em execução; porém, nenhuma animação se aplica neste exemplo) e, portanto, em vez do valor de setter de estilo, o valor definido localmente é usado para a tela de fundo no primeiro botão.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. O segundo botão não tem nenhum valor local (e nenhum outro valor com uma precedência mais alta do que um setter de estilo) e, portanto, a tela de fundo do botão é obtida do setter de estilo.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>

Por que a precedência da propriedade de dependência existe?Why does dependency property precedence exist?

Normalmente, você não desejará que os estilos sempre sejam aplicados e ocultem até mesmo um valor definido localmente de um elemento individual (caso contrário, será muito difícil usar estilos ou elementos em geral).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). Portanto, os valores obtidos de estilos operam com uma precedência mais baixa que o valor definido localmente.Therefore, the values that come from styles operate at a lower precedent than a locally set value. Para obter uma lista mais completa das propriedades de dependência e da possível origem de um valor efetivo de propriedade de dependência, consulte Precedência do valor da propriedade de dependência.For a more thorough listing of dependency properties and where a dependency property effective value might come from, see Dependency Property Value Precedence.

Observação

Há uma série de propriedades definidas em elementos do WPF que não são propriedades de dependência.There are a number of properties defined on WPF elements that are not dependency properties. De modo geral, as propriedades foram implementadas como propriedades de dependência somente quando houve a necessidade de dar suporte a, pelo menos, um dos cenários habilitados pelo sistema de propriedades: vinculação de dados, estilos, animação, suporte ao valor padrão, herança, propriedades anexadas ou invalidação.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.

Mais informações sobre propriedades de dependênciaLearning more about dependency properties

  • Uma propriedade anexada é um tipo de propriedade que dá suporte a uma sintaxe especializada em XAML.An attached property is a type of property that supports a specialized syntax in XAML. Uma propriedade anexada geralmente não tem uma correspondência de 1:1 com uma propriedade Common Language Runtime (CLR) e não é necessariamente uma propriedade de dependência.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. A finalidade típica de uma propriedade anexada é permitir que os elementos filho relatem valores de propriedade para um elemento pai, mesmo que o elemento pai e o elemento filho não tenham essa propriedade como parte das listagens de membros de classe.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. Um cenário principal é permitir que os elementos filhos informem o pai como devem ser apresentados no Interface de UsuárioUI; por exemplo, confira Dock ou Left.One primary scenario is to enable child elements to inform the parent how they should be presented in Interface de UsuárioUI; for an example, see Dock or Left. Para obter detalhes, consulte Visão geral das propriedades anexadas.For details, see Attached Properties Overview.

  • Os desenvolvedores de componentes ou de aplicativos podem desejar criar sua própria propriedade de dependência, a fim de habilitar funcionalidades como vinculação de dados ou suporte a estilos ou para o suporte à invalidação e coerção de valor.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. Para obter detalhes, consulte Propriedades de dependência personalizadas.For details, see Custom Dependency Properties.

  • De modo geral, as propriedades de dependência devem ser consideradas propriedades públicas, acessíveis ou, pelo menos, detectáveis por qualquer chamador que tem acesso a uma instância.Dependency properties should generally be considered to be public properties, accessible or at least discoverable by any caller that has access to an instance. Para obter mais informações, consulte Segurança das propriedades de dependência.For more information, see Dependency Property Security.

Consulte tambémSee also