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 příjemce existujících vlastností závislostí ve třídách WPF (Windows Presentation Foundation) a přečetli si přehled vlastností závislosti. 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í aplikace tohoto scénáře má podřízené prvky informovat nadřazený prvek o tom, jak mají být prezentovány v uživatelském rozhraní . Jedním z příkladů je DockPanel.Dock vlastnost. 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 sobě DockPanel , nikoli na DockPanel sobě. Třída DockPanel definuje statické DependencyProperty pole s názvem DockPropertya pak 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, a ne odkazovat 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, i když 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í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 tak, aby objekty pocházející z široké škály možných hierarchií tříd nebo logických relací mohly každou sestavu společné informace o 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 řadu možných nadřazených prvků a con režim stanu ls.

  • 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 definované nadřazeným objektem

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 DockPanel.Dock vlastnost a DockPanel má kód na úrovni třídy jako součást své logiky MeasureOverride vykreslování (konkrétně a ArrangeOverride). Instance DockPanel vždy zkontroluje, zda některé z jeho bezprostředních podřízených elementů 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é DockPanel instance každý zachází se svými vlastními kolekcemi podřízených elementů, ale toto chování je specifické pro implementaci, 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á DockPanel.Dock vlastnost nastavena na prvek, který nemá žádný DockPanel nadřazený prvek jednat s ním, není vyvolána žádná chyba nebo výjimka. To jednoduše znamená, že byla nastavena globální hodnota vlastnosti, ale nemá žádný aktuální DockPanel nadřazený objekt, který by mohl informace využívat.

Připojené vlastnosti v kódu

Připojené vlastnosti ve WPF nemají typické metody CLR "wrapper" pro snadný přístup 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 připojené vlastnosti implementovat vyhrazené metody přístupového objektu ve formuláři Get PropertyName a SetPropertyName. Tyto vyhrazené metody přístupového objektu jsou také užitečné k získání nebo nastavení připojené vlastnosti v kódu. Z pohledu kódu je připojená vlastnost podobná záložnímu poli, které má přístupové objekty metody místo přístupových objektů vlastností, a že backing pole může existovat u libovolného objektu, a nemusí 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 myCheckBoxCheckBox je instance třídy.

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, pokud myCheckBox ještě nebyl přidán jako podřízený prvek myDockPanel čtvrtého řádku kódu, pátý řádek kódu by nevyvolal výjimku, ale hodnota vlastnosti by nebyla interagována s nadřazeným prvkem DockPanel , a proto by nic nedělala. DockPanel.Dock Efektivní chování v vykreslené aplikaci způsobí pouze hodnota 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 nastavena tak, FrameworkPropertyMetadata aby určil vlastnosti vlastnosti, jako je například to, zda vlastnost ovlivňuje vykreslování, měření atd. Metadata připojené vlastnosti se obecně neliší od vlastnosti závislosti. Pokud zadáte výchozí hodnotu v přepsání na metadata připojených vlastností, tato hodnota se stane výchozí hodnotou implicitní připojené vlastnosti u instancí přepsání třídy. Konkrétně je výchozí hodnota hlášena, pokud některé procesy dotazují na hodnotu připojené vlastnosti prostřednictvím přístupového objektu Get metody pro tuto vlastnost, určení instance třídy, kde jste zadali metadata, a hodnota pro tuto připojenou vlastnost nebyla 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 naleznete v tématu Dědičnost hodnot vlastností.

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 tohoto rozložení je. Příklady existujících vlastností rozložení jsou DockPanel.Dock, Panel.ZIndexa Canvas.Top. Tento scénář je povolený tak, že prvky, které existují jako podřízené prvky pro řízení rozložení prvků, jsou schopny vyjádřit požadavky rozložení na nadřazené prvky rozložení jednotlivě, přičemž každé nastavení hodnoty vlastnosti, kterou nadřazený objekt definoval 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 úprav 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.

Vytvoření připojené vlastnosti

Pokud vaše třída definuje připojenou vlastnost přísně pro použití u jiných typů, třída nemusí odvozovat z DependencyObject. DependencyObject Pokud ale budete postupovat podle celkového modelu WPF, který má připojenou vlastnost, musí být také vlastností závislosti.

Definujte připojenou vlastnost jako vlastnost závislosti deklarováním public static readonly pole typu DependencyProperty. Toto pole definujete pomocí návratové RegisterAttached hodnoty metody. Název pole se musí shodovat s názvem připojené vlastnosti, připojen s řetězcem Property, aby se postupoval podle zavedeného vzoru WPF pojmenování identifikačních polí a vlastností, které představují. Poskytovatel připojených vlastností musí také poskytovat statické metody GetPropertyName a SetPropertyName jako přístupové objekty pro připojenou vlastnost. Pokud to neuděláte, systém vlastností nemůže použít připojenou vlastnost.

Poznámka:

Pokud vynecháte přístupové objekty připojené vlastnosti, datová vazba na vlastnosti nebude fungovat v nástrojích pro návrh, jako je Visual Studio a Blend pro Visual Studio.

The Get Accessor

Podpis přístupového objektu GetPropertyName musí být následující:

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 k nastavení na UIElement instancích.

  • Návratovou hodnotu je možné zadat jako konkrétnější typ v implementaci. Například GetDock metoda typ jako Dock, protože hodnota může být nastavena pouze na tento výčet.

Objekt Set Accessor

Podpis přístupového objektu SetPropertyName musí být následující:

public static void SetPropertyName(object target, object value)

  • Objekt target lze v implementaci zadat jako konkrétnější typ. Například SetDock metoda ji zadá jako UIElement, protože připojená vlastnost je určena pouze k nastavení na UIElement instancích.

  • Objekt value lze v implementaci zadat jako konkrétnější typ. Například SetDock metoda typ jako Dock, protože hodnota může být nastavena pouze na tento výčet. Nezapomeňte, že hodnota pro tuto metodu je vstup pocházející z zavaděče XAML, když narazí na vaši připojenou vlastnost v připojené vlastnosti použití v kódu. 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í RegisterAttached metody), stejně jako GetPropertyName a SetPropertyName přístupové objekty. V příkladu je IsBubbleSourcenázev připojené vlastnosti . 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 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:

Učení další informace o připojených vlastnostech

  • Další informace o vytvoření připojené vlastnosti naleznete v tématu Registrace připojené vlastnosti.

  • Pokročilejší scénáře použití vlastností závislostí a připojených vlastností naleznete v tématu Vlastní vlastnosti závislosti.

  • 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é