Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Dědičnost hodnot vlastností je funkce systému vlastností WINDOWS Presentation Foundation (WPF) a vztahuje se na vlastnosti závislostí. Dědičnost hodnot vlastností umožňuje podřízeným prvkům ve stromu prvků získat hodnotu konkrétní vlastnosti z nejbližšího nadřazeného prvku. Vzhledem k tomu, že nadřazený prvek mohl také získat hodnotu vlastnosti prostřednictvím dědičnosti hodnoty vlastnosti, systém se potenciálně vrací zpět ke kořeni stránky.
Systém vlastností WPF ve výchozím nastavení neumožňuje dědičnost hodnot vlastností a dědičnost hodnot je neaktivní, pokud není výslovně povolená v metadatech vlastností závislostí. I když je povolena dědičnost hodnot vlastností, podřízený prvek dědí hodnotu vlastnosti pouze tehdy, když chybí hodnota vyšší přednosti.
Požadavky
Článek předpokládá základní znalost vlastností závislostí a že jste si přečetli přehled vlastností závislostí. Pokud chcete postupovat podle příkladů v tomto článku, pomůže vám to, pokud znáte jazyk XAML (Extensible Application Markup Language) a víte, jak psát aplikace WPF.
Dědičnost prostřednictvím stromu elementů
Dědičnost hodnot vlastností není stejný koncept jako dědičnost tříd v objektově orientovaném programování, kde odvozené třídy dědí členy základní třídy. Tento druh dědičnosti je také aktivní ve WPF, ačkoli v XAML zděděné vlastnosti základní třídy jsou vystaveny jako atributy elementů XAML, které představují odvozené třídy.
Dědičnost hodnot vlastností je mechanismus, kterým se hodnota vlastnosti závislosti šíří z nadřazených na podřízené prvky ve stromu prvků, které obsahují vlastnost. V kódu XAML je strom prvků viditelný jako vnořené prvky.
Následující příklad ukazuje vnořené elementy v XAML. WPF zaregistruje AllowDrop vlastnost závislosti na třídě UIElement s metadaty, která umožňují dědičnost hodnoty vlastnosti a nastavují výchozí hodnotu na . Vlastnost AllowDrop
závislosti existuje na Canvas, StackPanela Label prvky, protože všechny jsou odvozeny od UIElement
. Vzhledem k tomu, že závislost vlastnosti na AllowDrop
je na canvas1
nastavena na true
, potomci stackPanel1
a label1
elementů zhodnotí true
jako svou hodnotu AllowDrop
.
<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>
Můžete také programově vytvořit strom prvků přidáním objektů elementů do kolekce podřízených prvků jiného elementu. Dědičnost hodnot vlastností v době běhu působí na výsledný strom objektů. V následujícím příkladu je stackPanel2
přidán do podřízené kolekce objektu canvas2
. Podobně je label2
přidán do dětské kolekce stackPanel2
. Vzhledem k tomu, že závislost vlastnosti na AllowDrop je na canvas2
nastavena na true
, potomci stackPanel2
a label2
elementů zhodnotí true
jako svou hodnotu AllowDrop
.
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)
Praktické aplikace dědičnosti hodnoty vlastností
Specifické vlastnosti závislosti WPF mají ve výchozím nastavení povolenou dědičnost hodnot, například AllowDrop a FlowDirection. Vlastnosti s povolenou dědičností hodnot jsou obvykle implementovány na základní třídy prvků uživatelského rozhraní, takže existují na odvozených třídách. Například vzhledem k tomu, že AllowDrop
je implementována v UIElement základní třídě, tato závislost vlastnost existuje také na každém ovládacím prvku odvozeného z UIElement
. WPF umožňuje dědičnost hodnot u vlastností závislostí, pro které je vhodné, aby uživatel nastavil hodnotu vlastnosti jednou u nadřazeného elementu a aby se tato hodnota vlastnosti šířil na potomky elementů ve stromu elementů.
Model dědičnosti hodnot vlastností přiřazuje hodnoty vlastností, zděděné i nezděděné podle priority hodnoty vlastnosti závislosti. Hodnota vlastnosti nadřazeného elementu se tedy použije pouze u podřízeného elementu, pokud vlastnost podřízeného elementu nemá vyšší prioritu, například místně nastavenou hodnotu nebo hodnotu získanou prostřednictvím stylů, šablon nebo datové vazby.
Vlastnost FlowDirection závislostí nastaví směr rozložení textových a podřízených prvků uživatelského rozhraní v rámci nadřazeného elementu. Obvykle byste očekávali, že směr toku textu a prvků uživatelského rozhraní na stránce bude konzistentní. Protože je dědičnost hodnot povolena ve vlastnosti metadataFlowDirection
, hodnota musí být nastavena pouze jednou v horní části stromu elementů pro stránku. Ve výjimečných případech, kdy je pro stránku určená kombinace směrů toku, je možné u elementu ve stromu nastavit jiný směr toku přiřazením hodnoty místně nastavené. Nový směr toku se pak rozšíří do následnických prvků pod danou úrovní.
Vytvoření vlastní vlastnosti zděděné
Vlastní vlastnost závislosti můžete udělat schopnou dědit tím, že povolíte Inherits vlastnost v instanci FrameworkPropertyMetadata a následně zaregistrujete svou vlastní vlastnost závazku s touto instancí metadat. Ve výchozím nastavení je Inherits
nastavena na false
v FrameworkPropertyMetadata
. Nastavení vlastnosti jako dědičné ovlivňuje výkon, takže nastavte Inherits
na true
pouze v případě, že je tato funkce potřebná.
Při registraci vlastnosti závislosti s Inherits
povoleným v metadatech použijte metodu RegisterAttached tak, jak je popsáno v části Registrace připojené vlastnosti. Také přiřaďte vlastnost výchozí hodnotu tak, aby zděděná hodnota existuje. Můžete také chtít vytvořit obálku vlastností s get
typem vlastníka a set
přístupové objekty stejně jako u neapojené vlastnosti závislosti. Tímto způsobem můžete nastavit hodnotu vlastnosti pomocí obálky vlastnosti u vlastníka nebo odvozeného typu. Následující příklad vytvoří vlastnost závislosti s IsTransparent
Inherits
povolenou a výchozí hodnotou false
. Příklad také obsahuje obálku vlastností s get
a set
přístupovými objekty.
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
Připojené vlastnosti jsou koncepčně podobné globálním vlastnostem. Jejich hodnotu můžete zkontrolovat na libovolném DependencyObject a získat platný výsledek. Typickým scénářem připojených vlastností je nastavení hodnot vlastností u podřízených prvků a tento scénář je efektivnější, pokud je daná vlastnost implicitně přítomna jako připojená vlastnost pro každý DependencyObject prvek ve stromu.
Dědění hodnot vlastností přes hranice stromu
Dědičnost vlastností probíhá procházením stromu prvků. Tento strom je často paralelní s logickým stromem. Při každém zahrnutí objektu základní úrovně WPF, například objektu Brushna úrovni kódu, který definuje strom elementů, jste vytvořili nesouvisený logický strom. Skutečný logický strom koncepčně nepřesahuje skrze Brush
, protože logický strom je koncept na úrovni architektury WPF. Pomocné metody LogicalTreeHelper můžete použít k analýze a zobrazení rozsahu logického stromu. Dědičnost hodnoty vlastnosti je schopna předat zděděné hodnoty prostřednictvím nesouviseného logického stromu, ale pouze v případě, že zděděná vlastnost byla zaregistrována jako připojená vlastnost a neexistuje úmyslná hranice blokování dědičnosti, například Frame.
Poznámka:
Ačkoli se může zdát, že dědičnost hodnot vlastností může fungovat pro nepřipojené závislostní vlastnosti, dědičné chování nepřipojené vlastnosti prostřednictvím některých hranic prvků ve stromu běhového prostředí není definováno. Kdykoli zadáte Inherits v metadatech vlastností, zaregistrujte své vlastnosti pomocí RegisterAttached.
Viz také
- metadata vlastnosti závislosti
- Přehled připojených vlastností
- Registrace připojené vlastnosti
- Uživatelsky definované vlastnosti závislostí
- Priorita hodnoty vlastnosti závislosti
- metadata vlastností Framework
.NET Desktop feedback