Přehled připojených vlastností
Připojená vlastnost je koncept definovaný XAML. Připojená vlastnost je určena k použití jako typ globální vlastnosti, která je nastavena pro jakýkoli objekt závislosti. Ve Windows Presentation Foundation (WPF) jsou připojené vlastnosti obvykle definovány jako specializovaná forma vlastnosti závislosti, která nemá konvenční vlastnost "obálka".
Požadavky
Tento článek předpokládá, že rozumíte vlastnostem závislostí z pohledu uživatele existujících vlastností závislostí ve třídách Windows Presentation Foundation (WPF) a přečetli jste si Přehled vlastností závislostí. Pokud chcete postupovat podle příkladů v tomto článku, měli byste také rozumět XAML a vědět, jak psát aplikace WPF.
Proč používat připojené vlastnosti
Jedním z účelů připojené vlastnosti je umožnit různým podřízeným prvkům zadat jedinečné hodnoty pro vlastnost, která je definována v nadřazeném prvku. Konkrétní aplikací tohoto scénáře je, že podřízené prvky informují nadřazený prvek o tom, jakým způsobem mají být prezentovány v uživatelském rozhraní. Jedním z příkladů je vlastnost DockPanel.Dock. Vlastnost DockPanel.Dock je vytvořena jako připojená vlastnost, protože je navržena tak, aby byla nastavena na prvky, které jsou obsaženy v DockPanel namísto samotné DockPanel. Třída DockPanel definuje statické pole DependencyProperty s názvem DockPropertya poté poskytuje GetDock a SetDock metody jako veřejné přístupové objekty pro připojenou vlastnost.
Připojené vlastnosti v XAML
V XAML nastavíte připojené vlastnosti pomocí syntaxe AttachedPropertyProvider.PropertyName
Následuje příklad nastavení DockPanel.Dock v JAZYCE XAML:
<DockPanel>
<TextBox DockPanel.Dock="Top">Enter text</TextBox>
</DockPanel>
Použití je poněkud podobné statické vlastnosti; vždy odkazujete na typ DockPanel, který vlastní a registruje připojenou vlastnost, místo odkazování na jakoukoli instanci určenou názvem.
Vzhledem k tomu, že připojená vlastnost v XAML je atribut, který jste nastavili v kódu, má pouze operace sady jakoukoli relevanci. V XAML nelze přímo získat vlastnost, ačkoli existují některé nepřímé mechanismy pro porovnávání hodnot, jako jsou triggery ve stylech (podrobnosti najdete v tématu Styling a šablonování).
Implementace připojené vlastnosti ve WPF
Ve Windows Presentation Foundation (WPF) se většina připojených vlastností souvisejících s uživatelským rozhraním u typů WPF implementuje jako vlastnosti závislosti. Připojené vlastnosti představují koncept XAML, zatímco vlastnosti závislostí představují koncept WPF. Vzhledem k tomu, že připojené vlastnosti WPF jsou vlastnosti závislostí, podporují koncepty vlastností závislostí, jako jsou metadata vlastností, a výchozí hodnoty z metadat této vlastnosti.
Způsob použití připojených vlastností vlastnícím typem
I když jsou připojené vlastnosti nastaveny u libovolného objektu, to neznamená, že nastavení vlastnosti vytvoří hmatatelný výsledek, nebo že hodnota bude někdy používána jiným objektem. Obecně platí, že připojené vlastnosti jsou určeny k tomu, aby objekty pocházející z široké škály možných hierarchií tříd nebo logických vztahů mohly sdělovat společné informace typu, který definuje připojenou vlastnost. Typ, který definuje připojenou vlastnost, obvykle následuje jeden z těchto modelů:
Typ, který definuje připojenou vlastnost je navržen tak, aby to mohl být nadřazený prvek prvků, které nastaví hodnoty pro připojenou vlastnost. Typ pak iteruje své podřízené objekty interní logikou proti určité struktuře stromu objektů, získá hodnoty a působí na tyto hodnoty nějakým způsobem.
Typ, který definuje připojenou vlastnost, bude použit jako podřízený prvek pro různorodé nadřazené prvky a modely obsahu.
Typ, který definuje připojenou vlastnost představuje službu. Jiné typy nastavují hodnoty pro připojenou vlastnost. Poté, když prvek, který nastaví vlastnost je vyhodnocen v kontextu služby, připojené hodnoty vlastnosti jsou získány prostřednictvím interní logiky třídy služby.
Příklad připojené vlastnosti Parent-Defined
Nejběžnější scénář, kdy WPF definuje připojenou vlastnost je, když nadřazený prvek podporuje podřízenou kolekci elementů a také implementuje chování, kdy jsou specifika chování hlášena jednotlivě pro každý podřízený prvek.
DockPanel definuje připojenou vlastnost DockPanel.Dock a DockPanel má kód na úrovni třídy jako součást své logiky vykreslování (konkrétně MeasureOverride a ArrangeOverride). Instance DockPanel vždy zkontroluje, zda některé z jeho bezprostředních podřízených prvků nastavily hodnotu pro DockPanel.Dock. Pokud ano, tyto hodnoty se stanou vstupem pro logiku vykreslování použitou na tento konkrétní podřízený prvek. Vnořené instance DockPanel každá zachází se svými vlastními kolekcemi podřízených elementů, ale toto chování je implementačně specifické podle toho, jak DockPanel zpracovává DockPanel.Dock hodnoty. Teoreticky je možné mít připojené vlastnosti, které ovlivňují prvky nad rámec bezprostřední nadřazené položky. Pokud je připojená vlastnost DockPanel.Dock nastavena na prvek, který nemá nadřazený prvek DockPanel, který by na něj působil, není vygenerována žádná chyba ani výjimka. To jednoduše znamená, že byla nastavena globální hodnota vlastnosti, ale nemá aktuální nadřazenou položku DockPanel, která by mohla informace využít.
Připojené vlastnosti v kódu
Připojené vlastnosti ve WPF nemají typické metody CLR „wrapper“ pro snadný přístup k metodám get/set. Důvodem je to, že připojená vlastnost není nutně součástí oboru názvů CLR pro instance, kde je vlastnost nastavena. Procesor XAML ale musí být schopen tyto hodnoty nastavit při analýze XAML. Aby bylo možné podporovat efektivní použití připojené vlastnosti, musí typ vlastníka této vlastnosti implementovat specifické přístupové metody ve formě GetPropertyName a SetPropertyName. Tyto vyhrazené přístupové metody jsou také užitečné k získání nebo nastavení přidružené vlastnosti v kódu. Z pohledu kódu je připojená vlastnost podobná záložnímu poli, které má přístupové metody místo přístupových vlastností, a toto záložní pole může existovat u libovolného objektu, aniž by muselo být výslovně definováno.
Následující příklad ukazuje, jak můžete nastavit připojenou vlastnost v kódu. V tomto příkladu je myCheckBox
instancí třídy CheckBox.
DockPanel myDockPanel = new DockPanel();
CheckBox myCheckBox = new CheckBox();
myCheckBox.Content = "Hello";
myDockPanel.Children.Add(myCheckBox);
DockPanel.SetDock(myCheckBox, Dock.Top);
Dim myDockPanel As New DockPanel()
Dim myCheckBox As New CheckBox()
myCheckBox.Content = "Hello"
myDockPanel.Children.Add(myCheckBox)
DockPanel.SetDock(myCheckBox, Dock.Top)
Podobně jako u případu XAML by v případě, že myCheckBox
ještě nebyl přidán jako podřízený prvek myDockPanel
čtvrtým řádkem kódu, pátý řádek kódu nevyvolá výjimku, ale hodnota vlastnosti nebude interagovat s nadřazenou DockPanel, a proto by nic nedělala. Efektivní chování v vykreslené aplikaci způsobí pouze hodnota DockPanel.Dock nastavená na podřízený prvek v kombinaci s přítomností DockPanel nadřazeného elementu. (V tomto případě můžete nastavit připojenou vlastnost a pak připojit ke stromu. Nebo můžete ke stromu připojit a pak nastavit připojenou vlastnost. Buď pořadí akcí poskytuje stejný výsledek.)
Metadata připojených vlastností
Při registraci vlastnosti je FrameworkPropertyMetadata nastaven tak, aby určil charakteristiky vlastnosti, jako například to, zda má vliv na vykreslování, měření a podobně. Metadata připojené vlastnosti se obecně neliší od vlastnosti závislosti. Pokud zadáte výchozí hodnotu v přepsání metadat pro připojené vlastnosti, tato hodnota se stane výchozí hodnotou implicitní připojené vlastnosti u instancí třídy, která přepisuje. Konkrétně je výchozí hodnota uvedena, pokud některé procesy zjišťují hodnotu připojené vlastnosti pomocí metody accessor pro tuto vlastnost Get
, při specifikaci instance třídy, kde jste zadali metadata, a hodnota pro tuto připojenou vlastnost nebyla jiným způsobem nastavena.
Pokud chcete povolit dědičnost hodnot vlastností u vlastnosti, měli byste použít připojené vlastnosti, nikoli vlastnosti závislosti, které nejsou připojené. Podrobnosti najdete v tématu Dědičnost hodnot vlastnosti.
Vlastní připojené vlastnosti
Kdy vytvořit připojenou vlastnost
Připojenou vlastnost můžete vytvořit, pokud existuje důvod, proč mít mechanismus nastavení vlastnosti k dispozici pro třídy jiné než definování třídy. Nejběžnějším scénářem je rozvržení. Příklady existujících vlastností rozložení jsou DockPanel.Dock, Panel.ZIndexa Canvas.Top. Tento scénář umožňuje, aby prvky, které existují jako podřízené prvky prvků řídících rozložení, mohly individuálně vyjádřit požadavky rozložení na jejich nadřazené prvky rozložení, s každým nastavením hodnoty vlastnosti, kterou definoval nadřazený objekt jako připojenou vlastnost.
Dalším scénářem použití připojené vlastnosti je situace, kdy vaše třída představuje službu a chcete, aby třídy mohly transparentněji integrovat službu.
Dalším scénářem je přijetí podpory návrháře WPF sady Visual Studio, například úpravy okna vlastnosti. Další informace najdete v tématu Přehled vytváření ovládacích prvků.
Jak už bylo zmíněno dříve, měli byste se zaregistrovat jako připojenou vlastnost, pokud chcete použít dědičnost hodnoty vlastnosti.
Jak vytvořit připojenou vlastnost
Pokud vaše třída definuje připojenou vlastnost přísně pro použití u jiných typů, třída nemusí odvozovat z DependencyObject. Pokud ale budete postupovat podle celkového modelu WPF, ve kterém je připojená vlastnost zároveň i závislou vlastností, musíte se odvodit z DependencyObject.
Definujte připojenou vlastnost jako závislou vlastnost deklarací public static readonly
pole typu DependencyProperty. Toto pole definujete pomocí návratové hodnoty metody RegisterAttached. Název pole se musí shodovat s názvem připojené vlastnosti, připojeným k řetězci Property
, aby bylo možné postupovat podle zavedeného vzoru WPF pojmenování identifikačních polí a vlastností, které představují. Zprostředkovatel připojené vlastnosti musí také poskytovat statické metody GetPropertyName a SetPropertyName jako přístupové metody pro připojenou vlastnost; pokud to neudělá, systém vlastností nebude moci vaši připojenou vlastnost použít.
Poznámka
Pokud vynecháte přístupový objekt připojené vlastnosti, datová vazba na vlastnost nebude fungovat v nástrojích pro návrh, jako je Visual Studio a Blend pro Visual Studio.
The Get Accessor
Podpis pro GetPropertyName přístupový prvek musí být:
public static object GetPropertyName(object target)
Objekt
target
lze v implementaci zadat jako konkrétnější typ. Například DockPanel.GetDock metoda zadá parametr jako UIElement, protože připojená vlastnost je určena pouze pro UIElement instance.Návratovou hodnotu je možné zadat jako konkrétnější typ v implementaci. Například metoda GetDock ji typizuje jako Dock, protože hodnotu lze nastavit pouze na tento výčet.
Objekt Set Accessor
Podpis pro NastavitPropertyName musí být:
public static void SetPropertyName(object target, object value)
Objekt
target
lze v implementaci zadat jako konkrétnější typ. Například SetDock metoda zadá jako UIElement, protože připojená vlastnost je určena pouze pro UIElement instance.Objekt
value
lze v implementaci zadat jako konkrétnější typ. Například metoda SetDock typuje jako Dock, protože hodnotu lze nastavit pouze na tuto enumeraci. Nezapomeňte, že hodnota pro tuto metodu je hodnota, kterou poskytuje zavaděč XAML, když narazí na vaši připojenou vlastnost při jejím použití v zápisu. Tento vstup je hodnota zadaná jako hodnota atributu XAML v kódu. Proto musí existovat podpora převodu typu, serializátoru hodnot nebo rozšíření značek pro typ, který používáte, aby se příslušný typ mohl vytvořit z hodnoty atributu (což je nakonec jen řetězec).
Následující příklad ukazuje registraci vlastnosti závislosti (pomocí metody RegisterAttached), stejně jako přístupové metody GetPropertyName a SetPropertyName. V příkladu je název připojené vlastnosti IsBubbleSource
. Proto musí být přístupové objekty pojmenovány GetIsBubbleSource
a SetIsBubbleSource
.
public static readonly DependencyProperty IsBubbleSourceProperty = DependencyProperty.RegisterAttached(
"IsBubbleSource",
typeof(Boolean),
typeof(AquariumObject),
new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender)
);
public static void SetIsBubbleSource(UIElement element, Boolean value)
{
element.SetValue(IsBubbleSourceProperty, value);
}
public static Boolean GetIsBubbleSource(UIElement element)
{
return (Boolean)element.GetValue(IsBubbleSourceProperty);
}
Public Shared ReadOnly IsBubbleSourceProperty As DependencyProperty = DependencyProperty.RegisterAttached("IsBubbleSource", GetType(Boolean), GetType(AquariumObject), New FrameworkPropertyMetadata(False, FrameworkPropertyMetadataOptions.AffectsRender))
Public Shared Sub SetIsBubbleSource(ByVal element As UIElement, ByVal value As Boolean)
element.SetValue(IsBubbleSourceProperty, value)
End Sub
Public Shared Function GetIsBubbleSource(ByVal element As UIElement) As Boolean
Return CType(element.GetValue(IsBubbleSourceProperty), Boolean)
End Function
Atributy pro připojené vlastnosti
WPF definuje několik atributů .NET, které mají poskytovat informace o připojených vlastnostech k procesům reflexe a typickým uživatelům reflexe a informací o vlastnostech, jako jsou návrháři. Vzhledem k tomu, že připojené vlastnosti mají typ neomezeného rozsahu, potřebují návrháři způsob, jak zabránit zahlcení uživatelů globálním seznamem všech připojených vlastností definovaných v konkrétní technologické implementaci, která používá XAML. Atributy .NET, které WPF definuje pro připojené vlastnosti, lze použít k určení rozsahu situací, kdy by se daná připojená vlastnost měla zobrazit v okně vlastností. Můžete zvážit také použití těchto atributů pro vlastní připojené vlastnosti. Účel a syntaxe atributů .NET je popsána na příslušných referenčních stránkách:
Další informace o připojených vlastnostech
Pro více informací o vytvoření připojené vlastnosti se podívejte na Registrace připojené vlastnosti.
Pokročilejší scénáře použití vlastností závislostí a připojených vlastností najdete v tématu vlastní vlastnosti závislostí.
Vlastnost můžete také zaregistrovat jako připojenou vlastnost a jako vlastnost závislosti, ale přesto vystavit implementace "obálky". V tomto případě lze vlastnost nastavit buď na tomto elementu, nebo na libovolném prvku prostřednictvím syntaxe připojené vlastnosti XAML. Příkladem vlastnosti s vhodným scénářem pro standardní i připojené použití je FrameworkElement.FlowDirection.
Viz také
- DependencyProperty
- Přehled vlastností závislosti
- vlastnosti vlastní závislosti
- XAML v WPF
- Zaregistrovat připojenou vlastnost
.NET Desktop feedback