Właściwości zależności i ładowania XAML

Bieżąca implementacja procesora XAML WPF jest z natury świadoma właściwości zależności. Procesor WPF XAML używa metod systemu właściwości dla właściwości zależności podczas ładowania binarnych XAML i atrybutów przetwarzania, które są właściwościami zależności. Skutecznie pomija otoki właściwości. Podczas implementowania niestandardowych właściwości zależności należy uwzględnić to zachowanie i unikać umieszczania dowolnego innego kodu w otoce właściwości innych niż metody GetValue systemu właściwości i SetValue.

Wymagania wstępne

W tym temacie założono, że rozumiesz właściwości zależności zarówno jako użytkownik, jak i autor, oraz zapoznaj się z tematem Właściwości zależności — omówienie i właściwości zależności niestandardowych. Należy również przeczytać kod XAML w składni WPF i XAML szczegółowo.

Implementacja modułu ładującego XAML WPF i wydajność

Ze względów implementacji jest ona obliczanie tańsza, aby zidentyfikować właściwość jako właściwość zależności i uzyskać dostęp do metody systemu SetValue właściwości, aby ją ustawić, zamiast używać otoki właściwości i jej ustawiacza. Jest to spowodowane tym, że procesor XAML musi wywnioskować cały model obiektu kodu zapasowego tylko na podstawie znajomości relacji typu i składowych, które są wskazywane przez strukturę znaczników i różne ciągi.

Typ jest przeszukiwany za pomocą kombinacji atrybutów xmlns i zestawu, ale identyfikując elementy członkowskie, określając, które mogą obsługiwać ustawianie jako atrybut, i rozpoznawanie typów, które obsługują wartości właściwości, w przeciwnym razie wymagałoby obszernego odbicia przy użyciu polecenia PropertyInfo. Ponieważ właściwości zależności dla danego typu są dostępne jako tabela magazynu za pośrednictwem systemu właściwości, implementacja WPF procesora XAML używa tej tabeli i wnioskowa, że każda dana właściwość ABC może być wydajniej ustawiana przez wywołanie SetValue zawierającego DependencyObject typ pochodny, przy użyciu identyfikatora właściwości zależności ABCProperty.

Implikacje dotyczące niestandardowych właściwości zależności

Ponieważ bieżąca implementacja WPF zachowania procesora XAML dla ustawienia właściwości całkowicie pomija otoki, nie należy umieszczać żadnej dodatkowej logiki w definicjach zestawu otoki dla niestandardowej właściwości zależności. Jeśli umieścisz taką logikę w definicji zestawu, logika nie zostanie wykonana, gdy właściwość jest ustawiona w języku XAML, a nie w kodzie.

Podobnie inne aspekty procesora XAML, które uzyskują wartości właściwości z przetwarzania XAML, również używają GetValue , a nie przy użyciu otoki. W związku z tym należy również unikać dodatkowej get implementacji w definicji poza wywołaniem GetValue .

Poniższy przykład to zalecana definicja właściwości zależności z otokami, gdzie identyfikator właściwości jest przechowywany jako publicstaticreadonly pole, a get definicje i set nie zawierają kodu poza niezbędnymi metodami systemu właściwości definiującymi tworzenie kopii zapasowej właściwości zależności.


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

Zobacz też