Sdílet prostřednictvím


Priorita hodnoty vlastnosti závislosti

Práce systému vlastností Windows Presentation Foundation (WPF) ovlivňují hodnotu vlastnosti závislosti. Tento článek vysvětluje, jak přednost různých vstupů založených na vlastnostech v rámci systému vlastností WPF určuje efektivní hodnotu vlastnosti závislosti.

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.

Systém vlastností WPF

Systém vlastností WPF využívá řady faktorů k určení hodnoty závislých vlastností, jako jsou ověření vlastností v reálném čase, pozdní vazba a oznámení o změnách souvisejících vlastností. Přestože pořadí a logika používané k určení hodnot vlastností závislostí jsou složité, učení vám může pomoct vyhnout se zbytečným nastavením vlastností a také zjistit, proč pokus o nastavení vlastnosti závislosti nezpůsobí očekávanou hodnotu.

Vlastnosti závislostí nastavené na více místech

Následující příklad XAML ukazuje, jak můžou tři různé operace "set" u vlastnosti tlačítka Background ovlivnit její hodnotu.

<StackPanel>
    <StackPanel.Resources>
        <ControlTemplate x:Key="ButtonTemplate" TargetType="{x:Type Button}">
            <Border Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}" 
                    BorderBrush="{TemplateBinding BorderBrush}">
                <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
            </Border>
        </ControlTemplate>
    </StackPanel.Resources>

    <Button Template="{StaticResource ButtonTemplate}" Background="Red">
        <Button.Style>
            <Style TargetType="{x:Type Button}">
                <Setter Property="Background" Value="Blue"/>
                <Style.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" Value="Yellow" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
        Which color do you expect?
    </Button>
</StackPanel>

V příkladu Background je vlastnost místně nastavena na Red. Implicitní styl deklarovaný v oboru tlačítka se však pokusí nastavit Background vlastnost na Blue. A když je myš nad tlačítkem, trigger v implicitním stylu se pokusí nastavit Background vlastnost na Yellow. S výjimkou převodu a animace má místně nastavená hodnota vlastnosti nejvyšší prioritu, takže tlačítko bude červené – i při najetí myší. Pokud ale z tlačítka odeberete místně nastavenou hodnotu, získá její Background hodnotu ze stylu. Ve stylu mají triggery přednost, takže tlačítko bude žluté při najetí myší a v opačném případě modré. Příklad nahradí výchozí hodnotu ControlTemplate tlačítka, protože výchozí šablona má pevně zakódovanou hodnotu myši Background .

Seznam priorit vlastností závislosti

Následující seznam je konečným pořadím priority, které systém vlastností používá při přiřazování hodnot modulu runtime k vlastnostem závislosti. Nejvyšší priorita je uvedena jako první.

  1. Donucení systému vlastností. Další informace o nátlaku naleznete viz Nátlak a animace.

  2. Aktivní animace nebo animace s funkcí podržení Pokud chcete mít praktický efekt, musí mít animační hodnota přednost před základní (neanimovanou) hodnotou, i když byla základní hodnota nastavena místně. Další informace najdete v tématu Nátlak a animace.

  3. Místní hodnoty. Místní hodnotu můžete nastavit prostřednictvím vlastnosti "obálka", která odpovídá nastavení atributu nebo elementu vlastnosti v XAML nebo voláním SetValue rozhraní API pomocí vlastnosti konkrétní instance. Místní hodnota nastavená prostřednictvím vazby nebo prostředku bude mít stejnou prioritu jako hodnota, která je přímo nastavená.

  4. Hodnoty vlastností šablony TemplatedParent Prvek obsahuje TemplatedParent , pokud byl vytvořen šablonou (ControlTemplate nebo DataTemplate). Další informace naleznete v tématu TemplatedParent. Pořadí přednosti v šabloně určené TemplatedParent, je:

    1. Spouště.

    2. Sady vlastností, obvykle prostřednictvím atributů XAML.

  5. Implicitní styly Platí pouze pro Style vlastnost. Hodnota Style je jakýkoli prostředek stylu s TargetType hodnotou, která odpovídá typu elementu. Prostředek stylu musí existovat v rámci stránky nebo aplikace. Vyhledávání implicitních prostředků stylů se nevztahuje na prostředky stylů v tématech.

  6. Spouštěče stylu Spouštěč stylu je spouštěč v rámci explicitního nebo implicitního stylu. Styl musí existovat v rámci stránky nebo aplikace. Triggery ve výchozím stylu mají nižší prioritu.

  7. Spouštěče šablon Spouštěč šablony je spouštěč z přímo použité šablony nebo ze šablony ve stylu. Styl musí existovat v rámci stránky nebo aplikace.

  8. Hodnoty stylového nastavovače. Hodnota setter stylu je hodnota aplikovaná Setter v rámci určitého stylu. Styl musí existovat v rámci stránky nebo aplikace.

  9. Výchozí styly, označované také jako styly motivu. Další informace naleznete v tématu Výchozí styly (Motiv). Ve výchozím stylu je pořadí priorit:

    1. Aktivní spouště.

    2. Nastavení.

  10. Dědičnost. Některé závislé vlastnosti podřízeného elementu dědí svou hodnotu z nadřazeného elementu. Proto nemusí být nutné nastavit hodnoty vlastností pro každý prvek v celé aplikaci. Další informace naleznete v tématu Dědičnost hodnoty vlastnosti.

  11. Výchozí hodnota z metadat vlastností závislostí Vlastnost závislosti může mít výchozí hodnotu nastavenou při registraci systému vlastností této vlastnosti. Odvozené třídy, které dědí vlastnost dependency, mohou přepsat metadata vlastnosti dependency (včetně výchozí hodnoty) na úrovni jednotlivých typů. Další informace naleznete v tématu metadata vlastností závislostí. U zděděné vlastnosti má výchozí hodnota nadřazeného prvku přednost před výchozí hodnotou podřízeného prvku. Pokud tedy není nastavena zděděná vlastnost, použije se výchozí hodnota kořenového nebo nadřazeného prvku místo výchozí hodnoty podřízeného prvku.

ŠablonovanýRodič

TemplatedParent priorita se nevztahuje na vlastnosti prvků, které jsou deklarovány přímo ve standardním kódu aplikace. Koncept TemplatedParent existuje pouze pro podřízené položky ve vizuálním stromu, které přicházejí do existence prostřednictvím aplikace šablony. Když systém vlastností prohledá šablonu určenou TemplatedParent pro hodnoty vlastnosti elementu, prohledává šablonu, která vytvořila prvek. Hodnoty vlastností ze TemplatedParent šablony obecně fungují, jako by byly místně nastavené hodnoty prvku, ale s menší prioritou než skutečné místní hodnoty, protože šablony jsou potenciálně sdíleny. Další informace najdete v tématu TemplatedParent.

Styl Vlastnost

Stejné pořadí priorit platí pro všechny vlastnosti závislosti s výjimkou Style vlastnosti. Vlastnost Style je jedinečná v tom, že nemůže být sama o sobě stylována. Vynucení nebo animace Style vlastnosti se nedoporučuje (a animování Style vlastnosti by vyžadovalo vlastní třídu animace). V důsledku toho se nepoužijí všechny položky priority. Vlastnost lze nastavit Style pouze třemi způsoby:

  • Explicitní styl Vlastnost Style elementu je nastavena přímo. Hodnota Style vlastnosti funguje jako místní hodnota a má stejnou prioritu jako položka 3 v seznamu priorit. Ve většině scénářů nejsou explicitní styly definovány jako vložené, ale jsou výslovně odkazovány jako zdroj, například Style="{StaticResource myResourceKey}".

  • Implicitní styl Style Vlastnost elementu není nastavena přímo. Místo toho se styl použije, pokud existuje na určité úrovni v rámci stránky nebo aplikace, a má klíč prostředku, který odpovídá typu prvku, na který se styl vztahuje, například <Style TargetType="x:Type Button">. Typ se musí přesně shodovat, například <Style TargetType="x:Type Button"> se nepoužije na MyButton typ, i když MyButton je odvozen z Button. Hodnota Style vlastnosti má stejnou prioritu jako položka 5 v seznamu priorit. Implicitní hodnotu stylu lze zjistit voláním DependencyPropertyHelper.GetValueSource metody, předáním Style vlastnosti a kontrolou ImplicitStyleReference výsledků.

  • Výchozí styl, označovaný také jako styl motivu. Style Vlastnost elementu není nastavena přímo. Pochází z vyhodnocení tematiky prováděného prezentačním enginem WPF za běhu. Před spuštěním je hodnota vlastnosti Stylenull. Hodnota Style vlastnosti má stejnou prioritu jako položka 9 v seznamu priorit.

Výchozí styly (motiv)

Každý ovládací prvek, který je součástí WPF, má výchozí styl, který se může lišit podle motivu, což je důvod, proč se výchozí styl někdy označuje jako styl motivu.

Jedná se ControlTemplate o důležitou položku ve výchozím stylu ovládacího prvku. ControlTemplate je nastavovací hodnota pro vlastnost stylu Template. Pokud výchozí styly šablonu neobsahují, ovládací prvek bez vlastní šablony v rámci vlastního stylu nebude mít žádný vizuální vzhled. Šablona nejen definuje vizuální vzhled ovládacího prvku, ale také definuje propojení mezi vlastnostmi ve vizuálním stromu šablony a odpovídající třídou ovládacího prvku. Každý ovládací prvek zveřejňuje sadu vlastností, které mohou ovlivnit vzhled ovládacího prvku bez nahrazení šablony. Představte si například výchozí vzhled Thumb ovládacího prvku, což je ScrollBar součást.

Ovládací Thumb prvek má určité přizpůsobitelné vlastnosti. Výchozí šablona Thumb ovládacího prvku vytvoří základní strukturu nebo strom vizuálu s několika vnořenými Border komponentami, které vytvoří zkosený vzhled. V šabloně jsou vlastnosti, které mají být přizpůsobitelné Thumb třídou, zpřístupněny prostřednictvím TemplateBinding

Výchozí styly určují TargetType v jejich definicích. Vyhodnocení motivu modulu runtime přiřazuje výchozí styl TargetType k vlastnosti DefaultStyleKey ovládacího prvku. Naproti tomu chování vyhledávání implicitních stylů používá skutečný typ ovládacího prvku. Hodnota DefaultStyleKey je zděděna do odvozených tříd, takže odvozené prvky, které by jinak neměly žádný přidružený styl, získají svůj výchozí vzhled. Pokud například odvozujete MyButton z Button, MyButton zdědí výchozí šablonu Button. Odvozené třídy mohou přepsat výchozí hodnotu DefaultStyleKey v metadatech vlastností závislostí. Pokud tedy chcete použít jinou vizuální reprezentaci pro MyButton, můžete přepsat metadata vlastnosti závislosti u DefaultStyleKey na MyButton a poté definovat příslušný výchozí styl včetně šablony, kterou zabalíte do ovládacího prvku MyButton. Další informace najdete v tématu Přehled vytváření ovládacích prvků.

Dynamický prostředek

Dynamický prostředek

Dynamické odkazy na prostředky nejsou technicky součástí systému vlastností a mají vlastní pořadí vyhledávání, které komunikuje se seznamem priorit. V podstatě je prioritou pro dynamické odkazy na zdroje: element, kořen stránky, aplikace, motiv a pak systém. Další informace najdete v tématu prostředky XAML.

I když mají dynamické odkazy na prostředky a vazby přednost umístění, ve kterém jsou nastavené, hodnota se odloží. Jedním z důsledků je to, že pokud nastavíte dynamický prostředek nebo vazbu na místní hodnotu, všechny změny místní hodnoty zcela nahradí dynamický prostředek nebo vazbu. I když zavoláte metodu ClearValue , která vymaže hodnotu místně nastavené, dynamický prostředek nebo vazba se neobnoví. Pokud zavoláte ClearValue na vlastnost, která má dynamický prostředek nebo vazbu (bez literální místní hodnoty), vymaže se tento prostředek nebo vazba.

NastavitAktuálníHodnotu

Metoda SetCurrentValue je dalším způsobem, jak nastavit vlastnost, ale není v seznamu priorit. SetCurrentValue umožňuje změnit hodnotu vlastnosti bez přepsání zdroje předchozí hodnoty. Pokud je například vlastnost nastavena triggerem a pak přiřadíte jinou hodnotu pomocí SetCurrentValue, další aktivační akce nastaví vlastnost zpět na hodnotu aktivační události. Kdykoli chcete nastavit hodnotu vlastnosti, aniž byste této hodnotě dali úroveň priority místní hodnoty, můžete ji použít SetCurrentValue . Podobně můžete použít SetCurrentValue ke změně hodnoty vlastnosti bez přepsání vazby.

Nucení a animace

Nucená konverze i animace fungují na základní hodnotě. Základní hodnota je hodnota vlastnosti závislosti s nejvyšší prioritou určenou vyhodnocením seznamu priorit směrem nahoru až do dosažení položky 2.

Pokud animace nezadává hodnoty vlastností FromTo pro určité chování nebo pokud se animace po dokončení záměrně vrátí k základní hodnotě, může základní hodnota ovlivnit animaci. Pokud to chcete vidět v praxi, spusťte ukázkovou aplikaci Cílové hodnoty . V ukázce zkuste pro výšku obdélníku nastavit počáteční místní hodnoty, které se liší od jakékoli From hodnoty. Ukázkové animace začínají ihned použitím hodnoty From místo základní hodnoty. Zadáním parametru StopFillBehavior, při dokončení animace resetuje hodnotu vlastnosti na její základní hodnotu. Normální priorita se používá pro stanovení základní hodnoty po skončení animace.

U jedné vlastnosti lze použít více animací, přičemž každá animace má jinou prioritu. Namísto použití animace s nejvyšší prioritou může prezentační engine WPF složit hodnoty animací, v závislosti na způsobu definování animací a typu animovaných hodnot. Další informace najdete v tématu Přehled animací.

Nucení je na vrcholu seznamu priorit. Dokonce i běžící animace podléhá donucení hodnot. Některé existující vlastnosti závislosti ve WPF mají integrovanou koerci. U vlastních vlastností závislostí můžete definovat chování nátlaku tím, že zapíšete CoerceValueCallback, který předáte jako součást metadat při vytváření vlastnosti. Můžete také změnit způsob vynucování existujících vlastností přepsáním metadat pro tuto vlastnost v odvozené třídě. Koerce interaguje se základní hodnotou takovým způsobem, že se omezení na koerci použijí, jak existují v daném okamžiku, ale základní hodnota je stále zachována. V důsledku toho, pokud jsou omezení nucení později zrušena, nucení vrátí co nejbližší hodnotu k základní hodnotě a potenciálně vliv nucení na vlastnost ustane, jakmile budou všechna omezení odstraněna. Další informace o chování vnucování hodnoty naleznete v tématu O zpětném volání a ověřování u vlastností závislostí.

Chování triggerů

Ovládací prvky často definují chování triggerů jako součást jejich výchozího stylu. Nastavení místních vlastností u ovládacích prvků může potenciálně kolidovat se spouštěcími triggery, což brání triggerům reagovat buď vizuálně nebo behaviorálně na události vyvolané uživatelem. Běžným použitím triggeru vlastnosti je řízení vlastností stavu, jako je IsSelected nebo IsEnabled. Například když Button je zakázané, spouštěč stylu motivu (IsEnabled je false) ve výchozím nastavení nastaví Foreground hodnotu, aby Button se zobrazilo šedě. Pokud jste nastavili místní Foreground hodnotu, bude mít vyšší přednost místní hodnota vlastnosti a převáží hodnotu stylu Foreground motivu, i když je Button zakázaný. Při nastavování hodnot vlastností, které přepisují chování spouštěcí události na úrovni tématu pro ovládací prvek, dávejte pozor, abyste neovlivňovali zamýšlenou uživatelskou zkušenost tohoto ovládacího prvku.

ClearValue

Metoda ClearValue vymaže všechny místně použité hodnoty vlastnosti závislosti pro prvek. Volání ClearValue ale nezaručuje, že výchozí hodnota vytvořená v metadatech během registrace vlastnosti je nová efektivní hodnota. Všichni ostatní účastníci v seznamu priorit jsou stále aktivní a odeberou se jenom místně nastavená hodnota. Pokud například zavoláte ClearValue vlastnost, která má styl motivu, použije se hodnota stylu motivu jako nová hodnota místo výchozího nastavení založeného na metadatech. Pokud chcete nastavit hodnotu vlastnosti na výchozí hodnotu registrovaných metadat, získejte výchozí hodnotu metadat dotazováním na metadata závislosti vlastnosti a místně nastavte hodnotu vlastnosti s voláním SetValue.

Viz také