Carregamento de XAML e propriedades da dependênciaXAML Loading and Dependency Properties

A implementação WPFWPF atual de seu processador XAMLXAML é inerentemente com reconhecimento de propriedade de dependência.The current WPFWPF implementation of its XAMLXAML processor is inherently dependency property aware. O WPFWPF XAMLXAML processador usa métodos de sistema de XAMLXAML propriedade para propriedades de dependência ao carregar atributos binários e de processamento que são propriedades de dependência.The WPFWPF XAMLXAML processor uses property system methods for dependency properties when loading binary XAMLXAML and processing attributes that are dependency properties. Isso desvia os wrappers de propriedade de forma efetiva.This effectively bypasses the property wrappers. Ao implementar propriedades de dependência personalizadas, você deve prestar contas desse comportamento e deve evitar colocar GetValue SetValuequalquer outro código em seu invólucro de propriedade que não seja os métodos do sistema de propriedade e .When you implement custom dependency properties, you must account for this behavior and should avoid placing any other code in your property wrapper other than the property system methods GetValue and SetValue.

Pré-requisitosPrerequisites

Este tópico pressupõe que você entende as propriedades de dependência das perspectivas de um consumidor e criador e que leu os tópicos Visão Geral das Propriedades de Dependência e Propriedades de Dependência Personalizada.This topic assumes that you understand dependency properties both as consumer and author and have read Dependency Properties Overview and Custom Dependency Properties. Também é necessário ter lido Visão Geral de XAML (WPF) e Sintaxe XAML em Detalhes.You should also have read XAML Overview (WPF) and XAML Syntax In Detail.

A implementação do Carregador XAML do WPF e o desempenhoThe WPF XAML Loader Implementation, and Performance

Por razões de implementação, é computacionalmente menos caro identificar um SetValue imóvel como um imóvel de dependência e acessar o método do sistema de propriedade para defini-lo, em vez de usar o invólucro de propriedade e seu setter.For implementation reasons, it is computationally less expensive to identify a property as a dependency property and access the property system SetValue method to set it, rather than using the property wrapper and its setter. Isso ocorre porque um processador XAMLXAML deve inferir todo o modelo de objeto do código de suporte baseado apenas no conhecimento das relações entre tipo e membro indicadas pela estrutura da marcação e várias cadeias de caracteres.This is because a XAMLXAML processor must infer the entire object model of the backing code based only on knowing the type and member relationships that are indicated by the structure of the markup and various strings.

O tipo é examinado através de uma combinação de xmlns e atributos de montagem, mas identificando os membros, determinando quais poderiam PropertyInfosuportar ser definidocomo um atributo, e resolvendo quais tipos o suporte de valores de propriedade exigiria uma reflexão extensiva usando .The type is looked up through a combination of xmlns and assembly attributes, but identifying the members, determining which could support being set as an attribute, and resolving what types the property values support would otherwise require extensive reflection using PropertyInfo. Como as propriedades de dependência de um determinado tipo são WPFWPF acessíveis XAMLXAML como uma tabela DependencyObject de armazenamento através do sistema de propriedade, SetValue a implementação de seu processador usa esta tabela e infere que qualquer determinada propriedade ABC pode ser definida de forma mais eficiente, solicitando o tipo derivado que contém, usando o identificador de propriedade de dependência ABCProperty.Because dependency properties on a given type are accessible as a storage table through the property system, the WPFWPF implementation of its XAMLXAML processor uses this table and infers that any given property ABC can be more efficiently set by calling SetValue on the containing DependencyObject derived type, using the dependency property identifier ABCProperty.

Implicações para Propriedades de Dependência PersonalizadasImplications for Custom Dependency Properties

Como a implementação WPFWPF atual do comportamento do processador XAMLXAML para a configuração de propriedade desvia os wrappers como um todo, não é necessário colocar nenhuma lógica adicional nas definições estabelecidas do wrapper para a propriedade de dependência personalizada.Because the current WPFWPF implementation of the XAMLXAML processor behavior for property setting bypasses the wrappers entirely, you should not put any additional logic into the set definitions of the wrapper for your custom dependency property. Se tal lógica for colocada na definição estabelecida, então, a lógica não será executada quando a propriedade estiver definida como XAMLXAML em vez de no código.If you put such logic in the set definition, then the logic will not be executed when the property is set in XAMLXAML rather than in code.

Da mesma forma, outros XAMLXAML aspectos do processador XAMLXAML que obtém valores de propriedade a partir do processamento também usam GetValue em vez de usar o invólucro.Similarly, other aspects of the XAMLXAML processor that obtain property values from XAMLXAML processing also use GetValue rather than using the wrapper. Portanto, você também deve evitar qualquer get implementação GetValue adicional na definição além da chamada.Therefore, you should also avoid any additional implementation in the get definition beyond the GetValue call.

O exemplo a seguir é uma definição recomendada de propriedade de dependência com public static readonly invólucros, onde o identificador de propriedade é armazenado como um campo, e as get definições não set contêm nenhum código além dos métodos necessários do sistema de propriedade que definem o backup da propriedade de dependência.The following example is a recommended dependency property definition with wrappers, where the property identifier is stored as a public static readonly field, and the get and set definitions contain no code beyond the necessary property system methods that define the dependency property backing.


public static readonly DependencyProperty AquariumGraphicProperty = DependencyProperty.Register(
  "AquariumGraphic",
  typeof(Uri),
  typeof(AquariumObject),
  new FrameworkPropertyMetadata(null,
      FrameworkPropertyMetadataOptions.AffectsRender,
      new PropertyChangedCallback(OnUriChanged)
  )
);
public Uri AquariumGraphic
{
  get { return (Uri)GetValue(AquariumGraphicProperty); }
  set { SetValue(AquariumGraphicProperty, value); }
}

Public Shared ReadOnly AquariumGraphicProperty As DependencyProperty = DependencyProperty.Register("AquariumGraphic", GetType(Uri), GetType(AquariumObject), New FrameworkPropertyMetadata(Nothing, FrameworkPropertyMetadataOptions.AffectsRender, New PropertyChangedCallback(AddressOf OnUriChanged)))
Public Property AquariumGraphic() As Uri
    Get
        Return CType(GetValue(AquariumGraphicProperty), Uri)
    End Get
    Set(ByVal value As Uri)
        SetValue(AquariumGraphicProperty, value)
    End Set
End Property

Confira tambémSee also