Dela via


XAML-laddning och beroendeegenskaper

Den aktuella WPF-implementeringen av XAML-processorn är beroendeegenskapsmedveten. WPF XAML-processorn använder egenskapssystemmetoder för beroendeegenskaper vid inläsning av binära XAML- och bearbetningsattribut som är beroendeegenskaper. Detta kringgår effektivt egenskapsomslutningarna. När du implementerar anpassade beroendeegenskaper måste du ta hänsyn till det här beteendet och bör undvika att placera någon annan kod i egenskapsomslutningen förutom de egenskapssystemmetoder som GetValue och SetValue.

Förutsättningar

Det här avsnittet förutsätter att du förstår beroendeegenskaper både som konsument och författare och har läst Översikt över beroendeegenskaper och anpassade beroendeegenskaper. Du bör också ha läst XAML i WPF samt XAML-syntax i detalj.

WPF XAML-inläsningsimplementering och prestanda

Av implementeringsskäl är det beräkningsmässigt billigare att identifiera en egenskap som en beroendeegenskap och komma åt egenskapssystemet SetValue metod för att ange den, i stället för att använda egenskapsomslutningen och dess setter. Det beror på att en XAML-processor måste härleda hela objektmodellen för bakgrundskoden baserat endast på att känna till de typ- och medlemsrelationer som anges av strukturen för markering och olika strängar.

Typen identifieras genom en kombination av xmlns och assembly-attribut, men att identifiera medlemmarna, avgöra vilka som kan ställas in som ett attribut, och fastställa vilka typer som egenskapsvärdena stöder skulle annars kräva en omfattande användning av reflektion med hjälp av PropertyInfo. Eftersom beroendeegenskaper för en viss typ är tillgängliga som en lagringstabell via egenskapssystemet använder WPF-implementeringen av dess XAML-processor den här tabellen och härleder att en viss egenskap ABC kan ställas in effektivare genom att anropa SetValue på den innehållande DependencyObject härledda typen, med hjälp av beroendeegenskapsidentifieraren ABCProperty-.

Konsekvenser för anpassade beroendeegenskaper

Eftersom den aktuella WPF-implementeringen av XAML-processorbeteendet för egenskapsinställningen kringgår omslutningen helt bör du inte lägga till någon ytterligare logik i uppsättningsdefinitionerna för omslutningen för din anpassade beroendeegenskap. Om du placerar sådan logik i uppsättningsdefinitionen körs inte logiken när egenskapen anges i XAML i stället för i kod.

På samma sätt använder även andra aspekter av XAML-processorn som hämtar egenskapsvärden från XAML-bearbetning GetValue i stället för att använda omslutningen. Därför bör du också undvika ytterligare implementering i get-definitionen utöver GetValue-anropet.

Följande exempel är en rekommenderad beroendeegenskapsdefinition med omslutning, där egenskapsidentifieraren lagras som ett publicstaticreadonly fält, och definitionerna get och set innehåller ingen kod utöver de nödvändiga egenskapssystemmetoderna som definierar stöd för beroendeegenskap.


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

Se även