Condividi tramite


Caricamento XAML e proprietà di dipendenza

L'implementazione WPF corrente del processore XAML dipende implicitamente dalle proprietà di dipendenza. Il processore WPF XAML utilizza metodi del sistema di proprietà per le proprietà di dipendenza al momento del caricamento del codice XAML binario e dell'elaborazione di attributi che sono proprietà di dipendenza. Ciò consente di ignorare in modo efficace i wrapper della proprietà. Quando si implementano proprietà di dipendenza personalizzate, è necessario tenere presente questo comportamento ed evitare di inserire nel wrapper della proprietà qualsiasi altro codice oltre ai metodi del sistema di proprietà GetValue e SetValue.

Nel presente argomento sono contenute le seguenti sezioni.

  • Prerequisiti
  • Implementazione del caricatore XAML WPF e prestazioni
  • Implicazioni per le proprietà di dipendenza personalizzate
  • Argomenti correlati

Prerequisiti

In questo argomento si presuppone la conoscenza delle proprietà di dipendenza sia in qualità di consumer, sia in qualità di autore oltre alla lettura di Cenni preliminari sulle proprietà di dipendenza e Proprietà Dependency personalizzate. È necessario inoltre aver letto Cenni preliminari su XAML (WPF) e Descrizione dettagliata della sintassi XAML.

Implementazione del caricatore XAML WPF e prestazioni

Per motivi di implementazione, dal punto di vista del calcolo risulta meno oneroso identificare una proprietà come proprietà di dipendenza e accedere al metodo SetValue del sistema di proprietà per impostarla, che utilizzare il wrapper della proprietà e il relativo metodo di impostazione. Ciò si verifica in quanto un processore XAML deve dedurre l'intero modello a oggetti del codice di supporto esclusivamente in base alla conoscenza delle relazioni tra tipi e membri indicate dalla struttura del markup e da varie stringhe.

Il tipo viene ricercato tramite una combinazione di attributi xmlns e di assembly, ma l'identificazione dei membri, la determinazione dei membri che è possibile impostare come attributi e la risoluzione dei tipi supportati dai valori di proprietà richiedono la reflection estesa mediante l'oggetto PropertyInfo. Dal momento che è possibile accedere alle proprietà di dipendenza di un determinato tipo come tabella di archiviazione tramite il sistema di proprietà, l'implementazione WPF del relativo processore XAML utilizza questa tabella e deduce che una data proprietà ABC può essere impostata in modo più efficace chiamando l'oggetto SetValue sul tipo derivato DependencyObject contenitore, mediante l'identificatore della proprietà di dipendenza ProprietàABC.

Implicazioni per le proprietà di dipendenza personalizzate

Poiché l'implementazione WPF corrente del comportamento del processore XAML per l'impostazione delle proprietà ignora completamente i wrapper, non è opportuno inserire logica aggiuntiva nelle definizioni stabilite del wrapper per la proprietà di dipendenza personalizzata. Se si inserisce tale logica nella definizione stabilita, questa non sarà eseguita quando la proprietà viene impostata in XAML piuttosto che nel codice.

Analogamente, anche altri aspetti del processore XAML che ottengono valori di proprietà dall'elaborazione XAML utilizzano l'oggetto GetValue piuttosto che il wrapper. Pertanto, è necessario evitare qualsiasi implementazione aggiuntiva nella definizione get oltre alla chiamata di GetValue.

L'esempio seguente è una definizione di una proprietà di dipendenza consigliata con wrapper, in cui l'identificatore di proprietà è archiviato come campo static public readonly e le definizioni get e set non contengono codice oltre ai metodi del sistema di proprietà necessari che definiscono il supporto della proprietà di dipendenza.


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

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); }
}

Vedere anche

Concetti

Cenni preliminari sulle proprietà di dipendenza

Cenni preliminari su XAML (WPF)

Metadati della proprietà di dipendenza

Proprietà di dipendenza di tipo insieme

Sicurezza della proprietà di dipendenza

Modelli di costruttore sicuri per DependencyObject