Přehled vlastností závislostí

Windows Presentation Foundation (WPF) poskytuje sadu služeb, které lze použít k rozšíření funkcí vlastnosti typu. Souhrnně se tyto služby obvykle označují jako systém vlastností WPF. Vlastnost, která je zálohovaná systémem vlastností WPF, se označuje jako vlastnost závislosti. Tento přehled popisuje systém vlastností WPF a možnosti vlastnosti závislosti. To zahrnuje způsob použití existujících vlastností závislostí v XAML a v kódu. Tento přehled také představuje specializované aspekty vlastností závislosti, jako jsou metadata vlastností závislosti, a způsob vytvoření vlastní vlastnosti závislosti ve vlastní třídě.

Požadavky

Toto téma předpokládá, že máte základní znalosti o systému typů .NET a objektově orientovaném programování. Abyste mohli postupovat podle příkladů v tomto tématu, měli byste také porozumět jazyku XAML a vědět, jak psát aplikace WPF. Další informace najdete v tématu Návod: Moje první desktopová aplikace WPF.

Vlastnosti závislosti a vlastnosti CLR

Ve WPF jsou vlastnosti obvykle zpřístupněny jako standardní vlastnosti rozhraní .NET. Na základní úrovni můžete s těmito vlastnostmi pracovat přímo a nikdy nevíte, že jsou implementovány jako vlastnost závislosti. Měli byste se ale seznámit s některými nebo všemi funkcemi systému vlastností WPF, abyste mohli tyto funkce využít.

Účelem vlastností závislosti je poskytnout způsob, jak vypočítat hodnotu vlastnosti na základě hodnoty jiných vstupů. Mezi tyto další vstupy můžou zahrnovat systémové vlastnosti, jako jsou motivy a předvolby uživatele, mechanismy určování vlastností za běhu, jako jsou datové vazby a animace/scénáře, šablony pro více použití, jako jsou prostředky a styly, nebo hodnoty známé prostřednictvím vztahů nadřazený-podřízený s dalšími prvky ve stromu elementů. Kromě toho je možné implementovat vlastnost závislosti, která poskytuje samostatné ověřování, výchozí hodnoty, zpětná volání, která monitorují změny jiných vlastností, a systém, který může na základě potenciálně informací o modulu runtime vyžádá hodnoty vlastností. Odvozené třídy mohou také změnit některé specifické vlastnosti existující vlastnosti přepsáním metadat vlastností závislosti, nikoli přepsáním skutečné implementace existujících vlastností nebo vytvořením nových vlastností.

V referenčních informacích k sadě SDK můžete zjistit, která vlastnost je vlastnost závislosti, a to přítomností oddílu Informace o vlastnostech závislostí na spravované referenční stránce pro tuto vlastnost. Oddíl Informace o vlastnostech závislostí obsahuje odkaz na pole identifikátoru pro tuto vlastnost závislosti a DependencyProperty obsahuje také seznam možností metadat, které jsou nastaveny pro tuto vlastnost, informace o přepsání podle třídy a další podrobnosti.

Vlastnosti závislosti zpět vlastnosti CLR

Vlastnosti závislostí a systém vlastností WPF rozšiřují funkce vlastností tím, že poskytují typ, který zálohuje vlastnost jako alternativní implementaci standardního vzoru zálohování vlastnosti pomocí soukromého pole. Název tohoto typu je DependencyProperty. Druhý důležitý typ, který definuje systém vlastností WPF, je DependencyObject. DependencyObject definuje základní třídu, která může registrovat a vlastnit vlastnost závislosti.

Následující seznam uvádí terminologii, která se používá s vlastnostmi závislostí:

  • Vlastnost Dependency: Vlastnost, která je zálohována objektem DependencyProperty.

  • Identifikátor vlastnosti závislosti: Instance DependencyProperty , která se získá jako návratová hodnota při registraci vlastnosti závislosti a pak je uložena jako statický člen třídy. Tento identifikátor se používá jako parametr pro mnoho rozhraní API, která komunikují se systémem vlastností WPF.

  • CLR "wrapper": Skutečné implementace get a set pro vlastnost. Tyto implementace začleňuje GetValueSetValue identifikátor vlastnosti závislosti pomocí volání a , čímž poskytují podporu pro vlastnost pomocí systému vlastností WPF.

Následující příklad definuje vlastnost IsSpinning závislosti a zobrazuje vztah identifikátoru DependencyProperty k vlastnosti, kterou zálohuje.

public static readonly DependencyProperty IsSpinningProperty =
    DependencyProperty.Register(
    "IsSpinning", typeof(Boolean),
    typeof(MyCode)
    );
public bool IsSpinning
{
    get { return (bool)GetValue(IsSpinningProperty); }
    set { SetValue(IsSpinningProperty, value); }
}
Public Shared ReadOnly IsSpinningProperty As DependencyProperty =
    DependencyProperty.Register("IsSpinning",
                                GetType(Boolean),
                                GetType(MyCode))

Public Property IsSpinning() As Boolean
    Get
        Return CBool(GetValue(IsSpinningProperty))
    End Get
    Set(ByVal value As Boolean)
        SetValue(IsSpinningProperty, value)
    End Set
End Property

Je důležitá konvence pojmenování vlastnosti a jejího backingového DependencyProperty pole. Název pole je vždy název vlastnosti s připojenou příponou Property . Další informace o této konvenci a jejich důvodech najdete v tématu Vlastní vlastnosti závislosti.

Nastavení hodnot vlastností

Vlastnosti můžete nastavit v kódu nebo v jazyce XAML.

Nastavení hodnot vlastností v jazyce XAML

Následující příklad XAML určuje barvu pozadí tlačítka jako červenou. Tento příklad ukazuje případ, SolidColorBrushkdy je hodnota jednoduchého řetězce pro atribut XAML typem převedena analyzátorem WPF XAML na typ WPF (Colorprostřednictvím ) ve vygenerovaém kódu.

<Button Background="Red" Content="Button!"/>

XAML podporuje různé formuláře syntaxe pro nastavení vlastností. Syntaxe, která se má použít pro konkrétní vlastnost, bude záviset na typu hodnoty, který vlastnost používá, a také na dalších faktorech, jako je přítomnost převaděče typů. Další informace o syntaxi XAML pro nastavení vlastností najdete v tématu XAML v syntaxi WPF a XAML podrobně.

Jako příklad syntaxe bez atributů ukazuje následující příklad XAML další pozadí tlačítka. Tentokrát se místo nastavení jednoduché plné barvy nastaví pozadí na obrázek s prvkem představujícím tento obrázek a zdrojem tohoto obrázku zadaným jako atribut vnořeného prvku. Toto je příklad syntaxe elementu vlastnosti.

<Button Content="Button!">
  <Button.Background>
    <ImageBrush ImageSource="wavy.jpg"/>
  </Button.Background>
</Button>

Nastavení vlastností v kódu

Nastavení hodnot vlastností závislosti v kódu je obvykle pouze volání implementace set vystavené "obálkou" CLR.

Button myButton = new Button();
myButton.Width = 200.0;
Dim myButton As New Button()
myButton.Width = 200.0

Získání hodnoty vlastnosti je také v podstatě volání implementace get "obálky":

double whatWidth;
whatWidth = myButton.Width;
Dim whatWidth As Double
whatWidth = myButton.Width

Můžete také volat rozhraní API systému vlastností a GetValue přímo SetValue . To obvykle není nutné, pokud používáte existující vlastnosti (obálky jsou pohodlnější a poskytují lepší informace o vlastnosti pro vývojářské nástroje), ale přímé volání rozhraní API je vhodné pro určité scénáře.

Vlastnosti je také možné nastavit v jazyce XAML a pak k nim přistupovat později v kódu prostřednictvím kódu na pozadí. Podrobnosti najdete v tématu Kód na pozadí a XAML ve WPF.

Funkce vlastností poskytovaná vlastností závislosti

Vlastnost závislosti poskytuje funkci, která rozšiřuje funkce vlastnosti na rozdíl od vlastnosti, která je zálohována polem. Tato funkce často představuje nebo podporuje jednu z následujících konkrétních funkcí:

Zdroje informací

Hodnotu vlastnosti závislosti lze nastavit odkazem na prostředek. Prostředky jsou obvykle určeny jako hodnota Resources vlastnosti kořenového prvku stránky nebo aplikace (tato umístění umožňují nejpohodlnější přístup k prostředku). Následující příklad ukazuje, jak definovat SolidColorBrush prostředek.

<DockPanel.Resources>
  <SolidColorBrush x:Key="MyBrush" Color="Gold"/>
</DockPanel.Resources>

Jakmile je prostředek definovaný, můžete na něj odkazovat a použít ho k poskytnutí hodnoty vlastnosti:

<Button Background="{DynamicResource MyBrush}" Content="I am gold" />

Na tento konkrétní prostředek se odkazuje jako na rozšíření značek DynamicResource (ve WPF XAML můžete použít odkaz na statický nebo dynamický prostředek). Pokud chcete použít dynamický odkaz na prostředek, musíte nastavit vlastnost závislosti, takže jde konkrétně o použití dynamického odkazu na prostředky, které je povoleno systémem vlastností WPF. Další informace najdete v tématu Prostředky XAML.

Poznámka

Prostředky se budou považovat za místní hodnotu, což znamená, že pokud nastavíte jinou místní hodnotu, vyloučíte odkaz na prostředek. Další informace najdete v tématu Priorita hodnot vlastností závislosti.

Datová vazba

Vlastnost závislosti může odkazovat na hodnotu prostřednictvím datové vazby. Datová vazba funguje prostřednictvím konkrétní syntaxe rozšíření značek v jazyce XAML nebo Binding objektu v kódu. U datové vazby se určení konečné hodnoty vlastnosti odkládá až do doby spuštění, kdy se hodnota získá ze zdroje dat.

Následující příklad nastaví vlastnost Content objektu pomocí Buttonvazby deklarované v jazyce XAML. Vazba používá zděděný kontext dat a zdroj XmlDataProvider dat (není zobrazen). Samotná vazba určuje požadovanou zdrojovou vlastnost v XPath rámci zdroje dat.

<Button Content="{Binding XPath=Team/@TeamName}"/>

Poznámka

Vazby jsou považovány za místní hodnotu, což znamená, že pokud nastavíte jinou místní hodnotu, vyloučíte vazbu. Podrobnosti najdete v tématu Priorita hodnot vlastností závislosti.

Vlastnosti závislosti nebo třída DependencyObject nativně INotifyPropertyChangedDependencyObject nepodporují pro účely vytváření oznámení o změnách v hodnotě zdrojové vlastnosti pro operace datových vazeb. Další informace o vytváření vlastností pro použití v datové vazbě, které mohou hlásit změny cíle datové vazby, najdete v tématu Přehled datových vazeb.

Styly

Styly a šablony jsou dva hlavní motivační scénáře pro použití vlastností závislostí. Styly jsou zvláště užitečné pro nastavení vlastností, které definují uživatelské rozhraní aplikace. Styly se obvykle definují jako prostředky v jazyce XAML. Styly pracují se systémem vlastností, protože obvykle obsahují "setery" pro konkrétní vlastnosti a také "triggery", které mění hodnotu vlastnosti na základě hodnoty jiné vlastnosti v reálném čase.

Následující příklad vytvoří jednoduchý styl (který by byl definován uvnitř slovníku, není zobrazen), a Resources pak použije tento styl Style přímo na vlastnost pro Button. Setter ve stylu nastaví vlastnost Background pro styl na Button zelenou.

<Style x:Key="GreenButtonStyle">
  <Setter Property="Control.Background" Value="Green"/>
</Style>
<Button Style="{StaticResource GreenButtonStyle}">I am green!</Button>

Další informace najdete v tématu Styly a šablonování.

Animace

Vlastnosti závislostí je možné animovat. Při použití a spuštění animace funguje animovaná hodnota s vyšší prioritou než jakákoli hodnota (například místní hodnota), kterou má vlastnost jinak.

Následující příklad animace BackgroundButton vlastnosti (technicky je BackgroundSolidColorBrushBackground animován pomocí syntaxe elementu vlastnosti k určení prázdné hodnoty jako , ColorSolidColorBrush pak vlastnost , která je přímo animovaná).

<Button>I am animated
  <Button.Background>
    <SolidColorBrush x:Name="AnimBrush"/>
  </Button.Background>
  <Button.Triggers>
    <EventTrigger RoutedEvent="Button.Loaded">
      <BeginStoryboard>
        <Storyboard>
          <ColorAnimation
            Storyboard.TargetName="AnimBrush" 
            Storyboard.TargetProperty="(SolidColorBrush.Color)"
            From="Red" To="Green" Duration="0:0:5" 
            AutoReverse="True" RepeatBehavior="Forever" />
        </Storyboard>
      </BeginStoryboard>
    </EventTrigger>
  </Button.Triggers>
</Button>

Další informace o animaci vlastností najdete v tématu Přehled animace aPřehled scénářů.

Přepsání metadat

Určité chování vlastnosti závislosti můžete změnit přepsáním metadat pro tuto vlastnost při odvození z třídy, která vlastnost závislosti původně zaregistruje. Přepsání metadat závisí na identifikátoru DependencyProperty . Přepsání metadat nevyžaduje opětovné implementace vlastnosti. Změnu metadat nativně zpracovává systém vlastností. Každá třída potenciálně obsahuje jednotlivá metadata pro všechny vlastnosti, které jsou zděděny ze základních tříd, na základě jednotlivých typů.

Následující příklad přepíše metadata pro vlastnost závislosti DefaultStyleKey. Přepsání těchto metadat konkrétní vlastnosti závislosti je součástí vzoru implementace, který vytváří ovládací prvky, které mohou používat výchozí styly z motivů.

public class SpinnerControl : ItemsControl
{
    static SpinnerControl()
    {
        DefaultStyleKeyProperty.OverrideMetadata(
            typeof(SpinnerControl),
            new FrameworkPropertyMetadata(typeof(SpinnerControl))
        );
    }
}
Public Class SpinnerControl
    Inherits ItemsControl
    Shared Sub New()
        DefaultStyleKeyProperty.OverrideMetadata(GetType(SpinnerControl), New FrameworkPropertyMetadata(GetType(SpinnerControl)))
    End Sub
End Class

Další informace o přepisování nebo získávání metadat vlastností najdete v tématu Metadata vlastností závislosti.

Dědičnost hodnot vlastností

Prvek může dědit hodnotu vlastnosti závislosti ze své nadřazené vlastnosti ve stromu objektů.

Poznámka

Chování dědičnosti hodnot vlastností není globálně povolené pro všechny vlastnosti závislosti, protože doba výpočtu dědičnosti má nějaký vliv na výkon. Dědičnost hodnot vlastností je obvykle povolená pouze pro vlastnosti, u kterých konkrétní scénář naznačuje, že je dědičnost hodnoty vlastnosti vhodná. To, jestli vlastnost závislosti dědí, můžete zjistit v části Informace o vlastnostech závislosti pro tuto vlastnost závislosti v referenčních informacích k sadě SDK.

Následující příklad ukazuje vazbu a nastaví vlastnost, DataContext která určuje zdroj vazby, který nebyl uveden v předchozím příkladu vazby. Jakékoli následné vazby v podřízených objektech nemusí specifikovat zdroj, mohou použít zděděnou hodnotu z DataContext v nadřazeném StackPanel objektu. (Případně se DataContextSourceBindingpodřízený objekt může místo toho rozhodnout, že v objektu zadá svůj vlastní objekt nebo , a záměrně nebude používat zděděnou hodnotu pro kontext dat svých vazeb.)

<StackPanel Canvas.Top="50" DataContext="{Binding Source={StaticResource XmlTeamsSource}}">
  <Button Content="{Binding XPath=Team/@TeamName}"/>
</StackPanel>

Další informace najdete v tématu Dědičnost hodnot vlastností.

Integrace návrháře WPF

Vlastní ovládací prvek s vlastnostmi, které jsou implementovány jako vlastnosti závislosti, obdrží odpovídající návrhář WPF pro Visual Studio podporu. Jedním z příkladů je možnost upravovat přímé a připojené vlastnosti závislostí pomocí okna Vlastnosti. Další informace najdete v tématu Přehled vytváření ovládacích prvků.

Priorita hodnot vlastností závislosti

Když získáte hodnotu vlastnosti závislosti, potenciálně získáváte hodnotu, která byla nastavena u této vlastnosti, prostřednictvím jakéhokoli jiného vstupu založeného na vlastnostech, které jsou součástí systému vlastností WPF. Priorita hodnot vlastností závislosti existuje proto, aby bylo možné předvídatelně pracovat s různými scénáři, jak mohou vlastnosti získat jejich hodnoty.

Představte si následující příklad. Příklad obsahuje styl, který platí pro všechna tlačítka a jejich Background vlastnosti, ale pak také určuje jedno tlačítko s místně nastavenou Background hodnotou.

Poznámka

Dokumentace k sadě SDK používá při diskusi o vlastnostech závislostí občas termíny "místní hodnota" nebo "místně nastavená hodnota". Místně nastavená hodnota je hodnota vlastnosti, která je nastavena přímo na instanci objektu v kódu nebo jako atribut prvku v jazyce XAML.

V zásadě platí, že pro první tlačítko je vlastnost nastavená dvakrát, ale platí pouze jedna hodnota: hodnota s nejvyšší prioritou. Místně nastavená hodnota má nejvyšší prioritu (s výjimkou běžící animace, ale v tomto příkladu se žádná animace) a proto se místo hodnoty setter stylu pro pozadí prvního tlačítka použije místně nastavená hodnota. Druhé tlačítko nemá žádnou místní hodnotu (a žádnou jinou hodnotu s vyšší prioritou než setter stylu) a proto pozadí v tomto tlačítku pochází ze setter stylu.

<StackPanel>
  <StackPanel.Resources>
    <Style x:Key="{x:Type Button}" TargetType="{x:Type Button}">
     <Setter Property="Background" Value="Red"/>
    </Style>
  </StackPanel.Resources>
  <Button Background="Green">I am NOT red!</Button>
  <Button>I am styled red</Button>
</StackPanel>

Proč existuje priorita vlastností závislostí?

Obvykle byste nechtěli, aby styly vždy byly aplikovány a skryty i místně nastavenou hodnotu jednotlivého prvku (jinak by bylo obtížné použít styly nebo prvky obecně). Proto hodnoty, které pocházejí ze stylů, pracují s nižším předcházejícím než místně nastavenou hodnotou. Podrobnější výpis vlastností závislostí a informace o tom, odkud může pochánět efektivní hodnota vlastnosti závislosti, najdete v tématu Priorita hodnot vlastností závislosti.

Poznámka

U prvků WPF je definována řada vlastností, které nejsou vlastnostmi závislosti. Ve velkých a velkých případech byly vlastnosti implementovány jako vlastnosti závislosti pouze v případě, že bylo potřeba podporovat alespoň jeden ze scénářů povolených systémem vlastností: datová vazba, styly, animace, podpora výchozích hodnot, dědičnost, připojené vlastnosti nebo zneplatnění.

Učení informace o vlastnostech závislostí

  • Připojená vlastnost je typ vlastnosti, která podporuje specializovanou syntaxi v jazyce XAML. Přidružená vlastnost často nemá souviset s vlastností common language runtime (CLR) 1:1 a nemusí nutně představovat vlastnost závislosti. Typickým účelem připojené vlastnosti je umožnit podřízeným prvkům hlásit hodnoty vlastností nadřazenému prvku, a to i v případě, že nadřazený prvek i podřízený prvek nemají vlastnost jako součást výpisu členů třídy. Jedním z primárních scénářů je umožnit podřízeným prvkům informovat nadřazenou komponentu o tom, jak by měly být prezentovány v uživatelském rozhraní. příklad najdete v tématu nebo DockLeft. Podrobnosti najdete v tématu Přehled připojených vlastností.

  • Vývojáři komponent nebo vývojáři aplikací mohou chtít vytvořit vlastní vlastnost závislosti, aby umožnili funkce, jako je podpora datových vazeb nebo stylů, nebo podporu zneplatnění a převodu hodnoty. Podrobnosti najdete v tématu Vlastní vlastnosti závislosti.

  • Vlastnosti závislostí vezměte v úvahu jako veřejné vlastnosti, které jsou přístupné nebo alespoň zjistitelné pro všechny volající, kdo má přístup k instanci. Další informace najdete v tématu Zabezpečení vlastností závislosti.

Viz také