Dela via


Prioritet för beroendeegenskapsvärde

Funktionerna i WPF-egenskapssystemet (Windows Presentation Foundation) påverkar värdet för en beroendeegenskap. Den här artikeln förklarar hur prioriteten för olika egenskapsbaserade indata i WPF-egenskapssystemet avgör det effektiva värdet för en beroendeegenskap.

Förutsättningar

Artikeln förutsätter grundläggande kunskaper om beroendeegenskaper och att du har läst Översikt över beroendeegenskaper. Om du vill följa exemplen i den här artikeln hjälper det om du är bekant med XAML (Extensible Application Markup Language) och vet hur du skriver WPF-program.

WPF-egenskapssystemet

WPF-egenskapssystemet använder en mängd olika faktorer för att fastställa värdet för beroendeegenskaper, till exempel verifiering av realtidsegenskaper, sen bindning och meddelanden om egenskapsändring för relaterade egenskaper. Även om ordningen och logiken som används för att fastställa värden för beroendeegenskap är komplex kan du undvika onödiga egenskapsinställningar och även ta reda på varför ett försök att ange en beroendeegenskap inte resulterade i det förväntade värdet.

Beroendeegenskaper som anges på flera ställen

I följande XAML-exempel visas hur tre olika "set"-åtgärder på knappens Background egenskap kan påverka dess värde.

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

I exemplet är egenskapen Background lokalt inställd på Red. Det implicita stilen som deklareras i knappens omfång försöker dock ställa in Background-egenskapen till Blue. Och när musen är över knappen försöker utlösaren i implicit format att ange Background egenskapen till Yellow. Förutom tvång och animering har ett lokalt angivet egenskapsvärde den högsta prioriteten, så knappen blir röd – även vid mouseover. Men om du tar bort det lokalt inställda värdet från knappen får det dess Background värde från formatet. Inom en stil har utlösare företräde, så knappen blir gul när man håller muspekaren över den och blå annars. Exemplet ersätter knappens standardvärde ControlTemplate eftersom standardmallen har ett hårdkodat mouseover-värde Background .

Prioritetslista för beroendeegenskap

Följande lista är den slutgiltiga prioritetsordningen som egenskapssystemet använder när du tilldelar körningsvärden till beroendeegenskaper. Högsta prioritet visas först.

  1. Tvingad egenskapssystem. Mer information om tvång finns i Tvång och animeringar.

  2. Aktiva animeringar eller animeringar med hållbeteende. För att ha en praktisk effekt måste ett animeringsvärde ha företräde framför basvärdet (oanimerad), även om basvärdet har angetts lokalt. Mer information finns i Tvång och animeringar.

  3. Lokala värden. Du kan ange ett lokalt värde via en "wrapper"-egenskap, vilket motsvarar att ange ett attribut eller egenskapselement i XAML, eller genom ett anrop till API:et SetValue med hjälp av en egenskap för en specifik instans. Ett lokalt värde som anges via en bindning eller resurs har samma prioritet som ett värde som anges direkt.

  4. MalldParent-mallegenskapsvärden. Ett element har ett TemplatedParent om det skapades av en mall (ControlTemplate eller DataTemplate). Mer information finns i TemplatedParent. I mallen som anges av TemplatedParentär prioritetsordningen:

    1. Utlösare.

    2. Egenskapsuppsättningar, vanligtvis via XAML-attribut.

  5. Implicita formatmallar. Gäller endast för egenskapen Style . Värdet Style är valfri formatresurs med ett TargetType värde som matchar elementtypen. Formatresursen måste finnas på sidan eller programmet. Sökning efter en implicit formatresurs utökas inte till formatresurser i Teman.

  6. Formatutlösare. En stilutlösare är en utlösare inom en explicit eller implicit stil. Stilen måste finnas på webbsidan eller applikationen. Utlösare i standardformat har lägre prioritet.

  7. Mallutlösare. En mallutlösare är en utlösare från en direkt tillämpad mall eller från en mall i en stil. Stilen måste finnas på webbsidan eller applikationen.

  8. Stilinställningsvärden. Ett stil-sättarvärde är ett värde som tillämpas av ett Setter inom en stil. Stilen måste finnas på webbsidan eller applikationen.

  9. Standardformat, även kallade temaformat. Mer information finns i Standardformat (tema). Inom ett standardformat är prioritetsordningen:

    1. Aktiva utlösare.

    2. Setters.

  10. Arv. Vissa beroendeegenskaper för ett underordnat element ärver sina värden från det överordnade elementet. Därför kanske det inte är nödvändigt att ange egenskapsvärden för varje element i programmet. För mer information, se egenskapsvärdesarv .

  11. Standardvärde från metadata för beroendeegenskap En beroendeegenskap kan ha ett standardvärde som anges under egenskapssystemets registrering av den egenskapen. Härledda klasser som ärver en beroendeegenskap kan åsidosätta metadata för beroendeegenskap (inklusive standardvärdet) per typ. Mer information finns i beroendeegenskapsmetadata. För en ärvd egenskap har standardvärdet för en förälder företräde framför standardvärdet för ett barn. Om en ärvbar egenskap inte har angetts används standardvärdet för roten eller den överordnade egenskapen i stället för standardvärdet för det underordnade elementet.

TemplatedParent

TemplatedParent prioritet gäller inte för egenskaper för element som deklareras direkt i standardprogrammarkeringen. Konceptet TemplatedParent finns bara för underordnade objekt i ett visuellt träd som kommer till genom att en mall tillämpas. När egenskapssystemet söker i mallen TemplatedParent som anges av för egenskapsvärdena för ett element söker det igenom mallen som skapade elementet. Egenskapsvärdena från mallen TemplatedParent fungerar vanligtvis som om de var lokalt angivna värden för elementet, men med mindre prioritet än faktiska lokala värden eftersom mallar kan delas. Mer information finns i TemplatedParent.

Egenskapen Stil

Samma prioritetsordning gäller för alla beroendeegenskaper, förutom egenskapen Style . Egenskapen Style är unik eftersom den inte kan formateras. Att tvinga eller animera Style egenskapen rekommenderas inte (och om egenskapen ska animeras Style krävs en anpassad animeringsklass). Därför gäller inte alla prioritetsobjekt. Det finns bara tre sätt att ange egenskapen Style :

  • Explicit stil. Egenskapen Style för ett element anges direkt. Egenskapsvärdet Style fungerar som om det vore ett lokalt värde och har samma prioritet som objekt 3 i prioritetslistan. I de flesta scenarier definieras inte explicita stilar inbäddade utan hänvisas istället till uttryckligen som en resurs, till exempel Style="{StaticResource myResourceKey}".

  • Implicit stil. Egenskapen Style för ett element anges inte direkt. I stället tillämpas ett format när det finns på någon nivå på sidan eller programmet och har en resursnyckel som matchar den typ av element som formatet gäller för, till exempel <Style TargetType="x:Type Button">. Typen måste matcha exakt, till exempel <Style TargetType="x:Type Button"> tillämpas inte på MyButton-typen, även om MyButton härleds från Button. Egenskapsvärdet Style har samma prioritet som objekt 5 i prioritetslistan. Ett implicit formatvärde kan identifieras genom att anropa DependencyPropertyHelper.GetValueSource metoden, skicka in Style egenskapen och söka ImplicitStyleReference efter i resultatet.

  • Standardformat, även kallat temaformat. Egenskapen Style för ett element anges inte direkt. I stället kommer det från evaluering av körtidens tema av WPF:s presentationsmotor. Före körning är Style egenskapsvärdet null. Egenskapsvärdet Style har samma prioritet som objekt 9 i prioritetslistan.

Standardformat (tema)

Varje kontroll som levereras med WPF har ett standardformat som kan variera beroende på tema, vilket är anledningen till att standardformatet ibland kallas för ett temaformat.

ControlTemplate är ett viktigt objekt i standardformatet för en kontroll. ControlTemplate är ett settervärde för formatets Template egenskap. Om standardformat inte innehåller en mall skulle en kontroll utan en anpassad mall som en del av ett anpassat format inte ha något visuellt utseende. En mall definierar inte bara kontrollens visuella utseende, den definierar även anslutningarna mellan egenskaperna i mallens visuella träd och motsvarande kontrollklass. Varje kontroll exponerar en uppsättning egenskaper som kan påverka kontrollens visuella utseende utan att ersätta mallen. Överväg till exempel standardvisualiseringen av en Thumb kontroll, som är en ScrollBar komponent.

En Thumb kontroll har vissa anpassningsbara egenskaper. Standardmallen för en Thumb kontroll skapar en grundläggande struktur, eller ett visuellt träd, med flera kapslade Border komponenter för att skapa ett fasettliknande utseende. I mallen exponeras egenskaper som är avsedda att anpassas av Thumb klassen via TemplateBinding

Standardformat anger en TargetType i sina definitioner. Utvärdering av teman vid körning anpassar TargetType standardstilen till DefaultStyleKey egenskapen för en kontroll. Sökningsbeteendet för implicita format använder däremot kontrollens faktiska typ. Värdet DefaultStyleKey ärvs av härledda klasser, så härledda element som annars inte har någon associerad stil får ett standardutseende. Om du till exempel härleder MyButton från Button, kommer MyButton att ärva standardmallen från Button. Härledda klasser kan åsidosätta standardvärdet DefaultStyleKey för i metadata för beroendeegenskap. Om du vill ha en annan visuell representation för MyButton, kan du åsidosätta metadata för beroendeegenskapen för DefaultStyleKeyMyButton, och sedan definiera den relevanta standardstilen, inklusive en mall, som du ska paketera med din MyButton-kontroll. Mer information finns i Översikt över kontrollredigering

Dynamisk resurs

Dynamisk resurs

Dynamiska resursreferenser är inte tekniskt sett en del av egenskapssystemet och har en egen uppslagsordning som interagerar med prioritetslistan. I huvudsak är ordningen för dynamiska resursreferenser: element till sidans rot, program, tema och sedan system. Mer information finns i XAML-resurser.

Även om dynamiska resursreferenser och bindningar har prioritet vid den plats där de anges, fördröjs värdet. En konsekvens av detta är att om du anger en dynamisk resurs eller bindning till ett lokalt värde ersätter alla ändringar av det lokala värdet helt den dynamiska resursen eller bindningen. Även om du anropar ClearValue metoden för att rensa det lokalt angivna värdet återställs inte den dynamiska resursen eller bindningen. Om du anropar ClearValue en egenskap som har en dynamisk resurs eller bindning (utan literalt lokalt värde) rensas den dynamiska resursen eller bindningen.

AngeNuvärde

Metoden SetCurrentValue är ett annat sätt att ange en egenskap, men den finns inte i prioritetslistan. SetCurrentValue gör att du kan ändra värdet för en egenskap utan att skriva över källan till ett tidigare värde. Om en egenskap till exempel anges av en utlösare och sedan tilldelar du ett annat värde med SetCurrentValue, kommer nästa utlösning att ange egenskapen tillbaka till utlösarvärdet. Du kan använda SetCurrentValue när du vill ange ett egenskapsvärde utan att ge det värdet prioritetsnivån för ett lokalt värde. På samma sätt kan du använda SetCurrentValue för att ändra värdet för en egenskap utan att skriva över en bindning.

Tvång och animering

Tvång och animering fungerar båda på ett basvärde. Basvärdet är värdet för beroendeegenskapen med högsta prioritet, som bestäms genom att utvärdera uppåt via prioritetslistan tills objekt 2 har nåtts.

Om en animering inte anger både From - och To egenskapsvärden för vissa beteenden, eller om animeringen avsiktligt återgår till basvärdet när den är klar, kan basvärdet påverka det animerade värdet. Om du vill se detta i praktiken kör du exempelprogrammet Målvärden . För rektangelhöjden i exemplet kan du prova att ange inledande lokala värden som skiljer sig från valfritt From värde. Exempelanimeringarna börjar direkt med värdet From i stället för basvärdet. När en animering har slutförts återställs ett egenskapsvärde till dess basvärde genom att Stop ange som FillBehavior. Normal prioritet används för basvärdesbestämning när en animering har upphört.

Flera animeringar kan tillämpas på en enda egenskap, där varje animering har olika prioritet. I stället för att använda animeringen med högsta prioritet kan WPF-presentationsmotorn sammansatta animeringsvärdena, beroende på hur animeringarna har definierats och vilken typ av värden som animeras. Mer information finns i Översikt över animering

Tvång finns överst i prioritetslistan. Även en animering som körs är föremål för värdetvång. Vissa befintliga beroendeegenskaper i WPF har inbyggt tvång. För anpassade beroendeegenskaper kan du definiera tvångsbeteende genom att skriva ett CoerceValueCallback som du skickar som en del av metadata när du skapar en egenskap. Du kan också åsidosätta tvångsbeteendet för befintliga egenskaper genom att åsidosätta metadata för den egenskapen i en härledd klass. Tvång interagerar med basvärdet på ett sådant sätt att begränsningarna för tvång tillämpas som de finns vid den tidpunkten, men basvärdet behålls fortfarande. Om tvångsbegränsningarna senare hävs returnerar tvånget därför det närmaste möjliga värdet till basvärdet, och eventuellt upphör tvångspåverkan på en egenskap så snart alla begränsningar hävs. Mer information om tvångsbeteende finns i Återanrop och validering av beroendeegenskap.

Utlösarbeteenden

Kontroller definierar ofta utlösarbeteenden som en del av standardformatet. Att ange lokala egenskaper för kontroller kan vara i konflikt med dessa utlösare, vilket hindrar utlösarna från att svara (antingen visuellt eller beteendemässigt) på användardrivna händelser. En vanlig användning av en egenskapsutlösare är att styra tillståndsegenskaper, till exempel IsSelected eller IsEnabled. När en Button är inaktiverad, anger en temaformatutlösare (IsEnabled är false) standardvärdet för Foreground så att Button ser nedtonat ut. Om du har angett ett lokalt Foreground-värde kommer det lokala egenskapsvärdet med högre prioritet att åsidosätta temaformatvärdet Foreground, även när Button är inaktiverat. När du anger egenskapsvärden som åsidosätter utlösarbeteenden på temanivå för en kontroll bör du vara noga med att inte i onödan störa den avsedda användarupplevelsen för den kontrollen.

ClearValue

Metoden ClearValue rensar alla lokalt tillämpade värden för en beroendeegenskap för ett element. Men anrop ClearValue garanterar inte att standardvärdet som upprättas i metadata under egenskapsregistreringen är det nya effektiva värdet. Alla andra deltagare i prioritetslistan är fortfarande aktiva och endast det lokalt angivna värdet tas bort. Om du till exempel anropar ClearValue en egenskap som har ett temaformat tillämpas värdet för temaformatet som det nya värdet i stället för det metadatabaserade standardvärdet. Om du vill ange ett egenskapsvärde till standardvärdet för registrerade metadata hämtar du standardvärdet för metadata genom att fråga efter metadata för beroendeegenskapen och lokalt ange egenskapsvärdet med ett anrop till SetValue.

Se även