Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
När du härleder från en klass som definierar en beroendeegenskap ärver du beroendeegenskapen och dess metadata. Den här artikeln beskriver hur du kan åsidosätta metadata för en ärvd beroendeegenskap genom att anropa OverrideMetadata metoden. Genom att åsidosätta metadata kan du ändra egenskaperna för den ärvda beroendeegenskapen så att den matchar underklassspecifika krav.
Bakgrund
En klass som definierar en beroendeegenskap kan ange dess egenskaper i PropertyMetadata eller någon av dess härledda typer, till exempel FrameworkPropertyMetadata. En av dessa egenskaper är standardvärdet för en beroendeegenskap. Många klasser som definierar beroendeegenskaper anger egenskapsmetadata under registrering av beroendeegenskap. När metadata inte anges under registreringen tilldelar WPF-egenskapssystemet ett PropertyMetadata
objekt med standardvärden. Härledda klasser som ärver beroendeegenskaper via klassarv har möjlighet att åsidosätta de ursprungliga metadata för alla beroendeegenskaper. På så sätt kan härledda klasser selektivt ändra egenskaper för beroendeegenskaper för att uppfylla klasskraven. När du anropar OverrideMetadata(Type, PropertyMetadata)anger en härledd klass sin egen typ som den första parametern och en metadatainstans som den andra parametern.
En härledd klass som åsidosätter metadata för en beroendeegenskap måste göra det innan egenskapen används av egenskapssystemet. En beroendeegenskap används när en instans av klassen som registrerar egenskapen instansieras. För att uppfylla det här kravet bör den härledda klassen anropa OverrideMetadata inom sin statiska konstruktor. Om du överskrider metadata för en beroendeegenskap när dess ägartyp har instansierats genereras inte undantag, men det resulterar i inkonsekventa beteenden i egenskapssystemet. Dessutom kan en härledd typ inte åsidosätta metadata för en beroendeegenskap mer än en gång, och försök att göra det skapar ett undantag.
Exempel
I följande exempel åsidosätter den härledda klassen TropicalAquarium
metadata för en beroendeegenskap som ärvts från basklassen Aquarium
. Metadatatypen är FrameworkPropertyMetadata, som stöder gränssnittsrelaterade WPF-ramverksegenskaper som AffectsRender. Den härledda klassen åsidosätter inte den ärvda AffectsRender
flaggan, men den uppdaterar standardvärdet AquariumGraphic
för på härledda klassinstanser.
public class Aquarium : DependencyObject
{
// Register a dependency property with the specified property name,
// property type, owner type, and property metadata.
public static readonly DependencyProperty AquariumGraphicProperty =
DependencyProperty.Register(
name: "AquariumGraphic",
propertyType: typeof(Uri),
ownerType: typeof(Aquarium),
typeMetadata: new FrameworkPropertyMetadata(
defaultValue: new Uri("http://www.contoso.com/aquarium-graphic.jpg"),
flags: FrameworkPropertyMetadataOptions.AffectsRender)
);
// Declare a read-write CLR wrapper with get/set accessors.
public Uri AquariumGraphic
{
get => (Uri)GetValue(AquariumGraphicProperty);
set => SetValue(AquariumGraphicProperty, value);
}
}
Public Class Aquarium
Inherits DependencyObject
' Register a dependency property with the specified property name,
' property type, owner type, and property metadata.
Public Shared ReadOnly AquariumGraphicProperty As DependencyProperty =
DependencyProperty.Register(
name:="AquariumGraphic",
propertyType:=GetType(Uri),
ownerType:=GetType(Aquarium),
typeMetadata:=New FrameworkPropertyMetadata(
defaultValue:=New Uri("http://www.contoso.com/aquarium-graphic.jpg"),
flags:=FrameworkPropertyMetadataOptions.AffectsRender))
' Declare a read-write CLR wrapper with get/set accessors.
Public Property AquariumGraphic As Uri
Get
Return CType(GetValue(AquariumGraphicProperty), Uri)
End Get
Set
SetValue(AquariumGraphicProperty, Value)
End Set
End Property
End Class
public class TropicalAquarium : Aquarium
{
// Static constructor.
static TropicalAquarium()
{
// Create a new metadata instance with a modified default value.
FrameworkPropertyMetadata newPropertyMetadata = new(
defaultValue: new Uri("http://www.contoso.com/tropical-aquarium-graphic.jpg"));
// Call OverrideMetadata on the dependency property identifier.
// Pass in the type for which the new metadata will be applied
// and the new metadata instance.
AquariumGraphicProperty.OverrideMetadata(
forType: typeof(TropicalAquarium),
typeMetadata: newPropertyMetadata);
}
}
Public Class TropicalAquarium
Inherits Aquarium
' Static constructor.
Shared Sub New()
' Create a new metadata instance with a modified default value.
Dim newPropertyMetadata As New FrameworkPropertyMetadata(
defaultValue:=New Uri("http://www.contoso.com/tropical-aquarium-graphic.jpg"))
' Call OverrideMetadata on the dependency property identifier.
' Pass in the type for which the new metadata will be applied
' and the new metadata instance.
AquariumGraphicProperty.OverrideMetadata(
forType:=GetType(TropicalAquarium),
typeMetadata:=newPropertyMetadata)
End Sub
End Class
Se även
.NET Desktop feedback