Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die Eigenschaftswertvererbung ist ein Feature des Windows Presentation Foundation (WPF)-Eigenschaftensystems und gilt für Abhängigkeitseigenschaften. Mit der Eigenschaftswertvererbung können untergeordnete Elemente in einer Struktur von Elementen den Wert einer bestimmten Eigenschaft aus dem nächstgelegenen übergeordneten Element abrufen. Da ein übergeordnetes Element möglicherweise auch seinen Eigenschaftswert über die Eigenschaftswertvererbung erhalten hat, rekursiert das System möglicherweise zurück zum Seitenstamm.
Das WPF-Eigenschaftensystem aktiviert die Eigenschaftswertvererbung standardmäßig nicht, und die Wertvererbung ist inaktiv, es sei denn, dies ist in Abhängigkeitseigenschaftsmetadaten ausdrücklich aktiviert. Selbst wenn die Eigenschaftswertvererbung aktiviert ist, erbt ein untergeordnetes Element nur einen Eigenschaftswert, wenn kein höherer Prioritätswert vorhanden ist.
Voraussetzungen
In diesem Artikel wird davon ausgegangen, dass Sie über grundlegende Kenntnisse von Abhängigkeitseigenschaften verfügen und eine Übersicht über Abhängigkeitseigenschaften gelesen haben. Um den Beispielen in diesem Artikel zu folgen, hilft es Ihnen, wenn Sie mit Extensible Application Markup Language (XAML) vertraut sind und wissen, wie WPF-Anwendungen geschrieben werden.
Vererbung durch einen Elementbaum
Die Eigenschaftswertvererbung ist nicht dasselbe Konzept wie die Klassenvererbung in objektorientierter Programmierung, bei der abgeleitete Klassen Basisklassenmber erben. Diese Art der Vererbung ist auch in WPF aktiv, obwohl in XAML die geerbten Basisklasseneigenschaften als Attribute von XAML-Elementen verfügbar gemacht werden, die abgeleitete Klassen darstellen.
Die Vererbung von Eigenschaftswerten ist der Mechanismus, mit dem ein Wert der Abhängigkeitseigenschaft von übergeordneten Elementen an untergeordnete Elemente innerhalb eines Elementenbaums weitergegeben wird, der diese Eigenschaft enthält. In XAML-Markup ist ein Baum von Elementen als geschachtelte Elemente sichtbar.
Das folgende Beispiel zeigt geschachtelte Elemente in XAML. WPF registriert die Abhängigkeitseigenschaft für die AllowDropUIElement Klasse mit Eigenschaftsmetadaten , die die Vererbung von Eigenschaftswerten ermöglicht, und legt den Standardwert auf false. Die AllowDrop-Abhängigkeitseigenschaft existiert bei Canvas, StackPanel, und Label-Elementen, da sie alle von UIElement ableiten. Da die Abhängigkeitseigenschaft von AllowDrop am canvas1 auf true festgelegt ist, erben die untergeordneten stackPanel1 und label1 Elemente ihren true als AllowDrop-Wert.
<Canvas x:Name="canvas1" Grid.Column="0" Margin="20" Background="Orange" AllowDrop="True">
<StackPanel Name="stackPanel1" Margin="20" Background="Green">
<Label Name="label1" Margin="20" Height="40" Width="40" Background="Blue"/>
</StackPanel>
</Canvas>
Sie können auch programmgesteuert eine Struktur von Elementen erstellen, indem Sie elementobjekte zur untergeordneten Elementauflistung eines anderen Elementobjekts hinzufügen. Zur Laufzeit wird die Eigenschaftswertvererbung auf dem resultierenden Objektbaum ausgeführt. Im folgenden Beispiel wird stackPanel2 der untergeordneten Auflistung von canvas2 hinzugefügt.
label2 wird ebenso der untergeordneten Auflistung von stackPanel2 hinzugefügt. Da die Abhängigkeitseigenschaft von AllowDrop am canvas2 auf true festgelegt ist, erben die untergeordneten stackPanel2 und label2 Elemente ihren true als AllowDrop-Wert.
Canvas canvas2 = new()
{
AllowDrop = true
};
StackPanel stackPanel2 = new();
Label label2 = new();
canvas2.Children.Add(stackPanel2);
stackPanel2.Children.Add(label2);
Dim canvas2 As New Canvas With {
.AllowDrop = True
}
Dim stackPanel2 As New StackPanel()
Dim label2 As New Label()
canvas2.Children.Add(stackPanel2)
stackPanel2.Children.Add(label2)
Praktische Anwendungen der Eigenschaftswertvererbung
Für bestimmte WPF-Abhängigkeitseigenschaften ist die Wertvererbung standardmäßig aktiviert, wie AllowDrop und FlowDirection. In der Regel werden Eigenschaften mit aktivierter Wertvererbung standardmäßig für Basis-UI-Elementklassen implementiert, sodass sie für abgeleitete Klassen vorhanden sind. Da AllowDrop beispielsweise in der UIElement-Basisklasse implementiert wird, liegt diese Abhängigkeitseigenschaft auch für jedes Steuerelement vor, das von UIElement abgeleitet ist. WPF ermöglicht die Wertvererbung für Abhängigkeitseigenschaften, für die es für einen Benutzer praktisch ist, den Eigenschaftswert einmal für ein übergeordnetes Element festzulegen und diesen Eigenschaftswert in absteigende Elemente in der Elementstruktur zu verteilen.
Das Eigenschaftswertvererbungsmodell weist Eigenschaftswerte, sowohl geerbt als auch unbeabsichtigt, entsprechend der Rangfolge der Abhängigkeitseigenschaft zu. Daher wird ein Wert der übergeordneten Elementeigenschaft nur auf ein untergeordnetes Element angewendet, wenn die untergeordnete Elementeigenschaft keinen höheren Rangfolgewert aufweist, z. B. einen lokal festgelegten Wert oder einen Wert, der durch Formatvorlagen, Vorlagen oder Datenbindung abgerufen wird.
Die FlowDirection Abhängigkeitseigenschaft legt die Layoutrichtung von Text- und untergeordneten UI-Elementen innerhalb eines übergeordneten Elements fest. Normalerweise erwarten Sie, dass die Flussrichtung von Text- und UI-Elementen innerhalb einer Seite konsistent ist. Da die Wertvererbung in den Metadaten der Eigenschaft von FlowDirection aktiviert ist, muss ein Wert nur einmal an der Spitze des Elementbaums für eine Seite festgelegt werden. In dem seltenen Fall, dass eine Mischung von Flussrichtungen für eine Seite gewünscht ist, kann eine andere Flussrichtung für ein Element im Baum eingestellt werden, indem ein lokal festgelegter Wert zugewiesen wird. Die neue Flussrichtung wird dann an untergeordnete Elemente unterhalb dieser Ebene weitergegeben.
Eine benutzerdefinierte Eigenschaft vererbbar machen
Sie können eine benutzerdefinierte Abhängigkeitseigenschaft vererbbar machen, indem Sie die Inherits Eigenschaft in einer Instanz von FrameworkPropertyMetadata und dann die benutzerdefinierte Abhängigkeitseigenschaft bei dieser Metadateninstanz registrieren. Standardmäßig ist Inherits auf false in FrameworkPropertyMetadata festgelegt. Das Vererbbar-Machen eines Eigenschaftswertes wirkt sich auf die Leistung aus, daher sollte Inherits nur auf true gesetzt werden, wenn dieses Feature erforderlich ist.
Wenn Sie eine Abhängigkeitseigenschaft mit Inherits aktivierten Metadaten registrieren, verwenden Sie die RegisterAttached Methode, wie unter Register an attached property beschrieben. Weisen Sie der Eigenschaft außerdem einen Standardwert zu, sodass ein vererbbarer Wert vorhanden ist. Möglicherweise möchten Sie auch einen Eigenschaften-Wrapper mit get und set Zugriffsobjekten für den Eigentümertyp erstellen, genau wie bei einer nicht gebundenen Abhängigkeitseigenschaft. Auf diese Weise können Sie den Eigenschaftswert mithilfe des Eigenschafts-Wrappers bei einem Besitzer oder einem abgeleiteten Typ festlegen. Im folgenden Beispiel wird eine Abhängigkeitseigenschaft namens IsTransparent, mit Inherits aktiviert und einem Standardwert von false. Das Beispiel enthält auch einen Eigenschaften-Wrapper mit get und set Accessoren.
public class Canvas_IsTransparentInheritEnabled : Canvas
{
// Register an attached dependency property with the specified
// property name, property type, owner type, and property metadata
// (default value is 'false' and property value inheritance is enabled).
public static readonly DependencyProperty IsTransparentProperty =
DependencyProperty.RegisterAttached(
name: "IsTransparent",
propertyType: typeof(bool),
ownerType: typeof(Canvas_IsTransparentInheritEnabled),
defaultMetadata: new FrameworkPropertyMetadata(
defaultValue: false,
flags: FrameworkPropertyMetadataOptions.Inherits));
// Declare a get accessor method.
public static bool GetIsTransparent(Canvas element)
{
return (bool)element.GetValue(IsTransparentProperty);
}
// Declare a set accessor method.
public static void SetIsTransparent(Canvas element, bool value)
{
element.SetValue(IsTransparentProperty, value);
}
// For convenience, declare a property wrapper with get/set accessors.
public bool IsTransparent
{
get => (bool)GetValue(IsTransparentProperty);
set => SetValue(IsTransparentProperty, value);
}
}
Public Class Canvas_IsTransparentInheritEnabled
Inherits Canvas
' Register an attached dependency property with the specified
' property name, property type, owner type, and property metadata
' (default value is 'false' and property value inheritance is enabled).
Public Shared ReadOnly IsTransparentProperty As DependencyProperty =
DependencyProperty.RegisterAttached(
name:="IsTransparent",
propertyType:=GetType(Boolean),
ownerType:=GetType(Canvas_IsTransparentInheritEnabled),
defaultMetadata:=New FrameworkPropertyMetadata(
defaultValue:=False,
flags:=FrameworkPropertyMetadataOptions.[Inherits]))
' Declare a get accessor method.
Public Shared Function GetIsTransparent(element As Canvas) As Boolean
Return element.GetValue(IsTransparentProperty)
End Function
' Declare a set accessor method.
Public Shared Sub SetIsTransparent(element As Canvas, value As Boolean)
element.SetValue(IsTransparentProperty, value)
End Sub
' For convenience, declare a property wrapper with get/set accessors.
Public Property IsTransparent As Boolean
Get
Return GetValue(IsTransparentProperty)
End Get
Set(value As Boolean)
SetValue(IsTransparentProperty, value)
End Set
End Property
End Class
Angefügte Eigenschaften ähneln konzeptuell globalen Eigenschaften. Sie können ihren Wert in jedem DependencyObject Fall überprüfen und ein gültiges Ergebnis erhalten. Das typische Szenario für angefügte Eigenschaften besteht darin, Eigenschaftswerte für untergeordnete Elemente festzulegen, und dieses Szenario ist effektiver, wenn die betreffende Eigenschaft implizit als angefügte Eigenschaft für jedes DependencyObject Element in der Struktur vorhanden ist.
Vererbung von Eigenschaften über Baumgrenzen hinweg
Vererbung erfolgt durch die Traversierung einer Elementstruktur. Diese Struktur ist häufig parallel zur logischen Struktur. Wenn Sie jedoch ein WPF-Objekt auf Kernebene, z. B. ein Brush, in das Markup einfügen, das eine Elementstruktur definiert, haben Sie eine nicht zusammenhängende logische Struktur erstellt. Eine echte logische Struktur wird nicht konzeptionell durch Brush erweitert, da die logische Struktur ein Konzept auf der Ebene des WPF-Frameworks ist. Sie können die Hilfsmethoden von LogicalTreeHelper verwenden, um den Umfang eines logischen Baums zu analysieren und darzustellen. Die Eigenschaftswertvererbung kann geerbte Werte über eine nicht zusammenhängende logische Struktur übergeben, aber nur, wenn die vererbbare Eigenschaft als angefügte Eigenschaft registriert wurde und keine absichtliche Vererbungsblockierungsgrenze vorhanden ist, z. B. eine Frame.
Hinweis
Obwohl die Eigenschaftswertvererbung möglicherweise für nicht angeheftete Abhängigkeitseigenschaften funktioniert, ist das Vererbungsverhalten für eine nicht angeheftete Eigenschaft über einige Elementgrenzen im Laufzeitbaum nicht definiert. Wenn Sie in Eigenschaftenmetadaten angeben Inherits , registrieren Sie Ihre Eigenschaften mithilfe von RegisterAttached.
Siehe auch
.NET Desktop feedback