Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
De huidige WPF-implementatie van de XAML-processor is inherent bewust van afhankelijkheidseigenschappen. De WPF XAML-processor maakt gebruik van eigenschappensysteemmethoden voor afhankelijkheidseigenschappen bij het laden van binaire XAML en verwerkingskenmerken die afhankelijkheidseigenschappen zijn. Hierdoor worden de property wrappers effectief omzeild. Wanneer u aangepaste afhankelijkheidseigenschappen implementeert, moet u rekening houden met dit gedrag en moet u voorkomen dat andere code in de eigenschapswikkelaar wordt geplaatst dan de methoden van het eigenschappensysteem GetValue en SetValue.
Voorwaarden
Dit onderwerp gaat ervan uit dat u afhankelijkheidseigenschappen begrijpt, zowel als consument als auteur, en dat u Overzicht van afhankelijkheidseigenschappen en Aangepaste afhankelijkheidseigenschappenhebt gelezen. U moet ook XAML in WPF en XAML-syntaxis in Detailhebben gelezen.
De implementatie en prestaties van de WPF XAML Loader
Om implementatieredenen is het computationeel minder kostbaar om een eigenschap als afhankelijkheidseigenschap te identificeren en toegang te krijgen tot de eigenschapssysteem SetValue-methode om deze in te stellen, in plaats van de eigenschapswikkelaar en de setter ervan te gebruiken. Dit komt doordat een XAML-processor het volledige objectmodel van de backingcode moet afleiden op basis van het weten van het type en de lidrelaties die worden aangegeven door de structuur van de markeringen en verschillende tekenreeksen.
Het type wordt opgezocht via een combinatie van xmlns en assembly-kenmerken, maar het identificeren van de leden, bepalen welke als kenmerk kunnen worden ingesteld, en het verhelderen van de typen die door de eigenschapswaarden worden ondersteund, zou anders uitgebreide reflectie vereisen met behulp van PropertyInfo. Omdat afhankelijkheidseigenschappen van een bepaald type toegankelijk zijn als een opslagtabel via het eigenschappensysteem, gebruikt de WPF-implementatie van de XAML-processor deze tabel en wordt afgeleid dat een bepaalde eigenschap ABC- efficiƫnter kan worden ingesteld door SetValue aan te roepen op het betreffende DependencyObject afgeleide type, met behulp van de id van de afhankelijkheidseigenschap ABCProperty.
Gevolgen voor aangepaste eigenschappen van afhankelijkheden
Omdat de huidige WPF-implementatie van het XAML-processorgedrag voor eigenschapsinstelling de wrappers volledig omzeilt, moet u geen aanvullende logica in de setdefinities van de wrapper plaatsen voor uw aangepaste afhankelijkheidseigenschap. Als u dergelijke logica in de setdefinitie plaatst, wordt de logica niet uitgevoerd wanneer de eigenschap is ingesteld in XAML in plaats van in code.
Op dezelfde manier gebruiken andere aspecten van de XAML-processor die eigenschapswaarden verkrijgen van XAML-verwerking ook GetValue in plaats van de wrapper te gebruiken. Daarom moet u ook eventuele extra implementaties in de get
definitie buiten de GetValue-aanroep vermijden.
Het volgende voorbeeld is een aanbevolen definitie van de afhankelijkheidseigenschap met wrappers, waarbij de eigenschaps-id wordt opgeslagen als een public
static
readonly
veld, en de get
- en set
definities geen code bevatten buiten de benodigde eigenschapssysteemmethoden die de back-up van de afhankelijke eigenschap definiƫren.
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
Zie ook
.NET Desktop feedback