Mallinställningsklasser

Förutsättningar

Vi antar att du kan lägga till kontroller i användargränssnittet, ange deras egenskaper och koppla händelsehanterare. Anvisningar för hur du lägger till kontroller i din app finns i Lägga till kontroller och hantera händelser. Vi antar också att du känner till grunderna för hur du definierar en anpassad mall för en kontroll genom att göra en kopia av standardmallen och redigera den. Mer information om detta finns i Kontrollmallar.

Scenariot för TemplateSettings-klasser

TemplateSettings-klasser tillhandahåller en uppsättning egenskaper som används när du definierar en ny kontrollmall för en kontroll. Egenskaperna har värden som pixelmätningar för storleken på vissa elementdelar i användargränssnittet. Värdena är ibland beräknade värden som kommer från kontrolllogik som vanligtvis inte är lätta att åsidosätta eller ens komma åt. Vissa av egenskaperna är avsedda som från och till värden som styr övergångar och animationer av komponenter, och därför kommer de relevanta TemplateSettings-egenskaperna i par.

Det finns flera TemplateSettings-klasser . Alla finns i . Xaml.Controls.Primitives-namnrymd . Varje klass har en associerad TemplateSettings-egenskap på den relevanta kontrollen. Den här egenskapen TemplateSettings är hur du kommer åt templateSettings-värdena för kontrollen och kan upprätta mallbindningar till dess egenskaper.

Här följer några exempel på relaterade klasser och egenskaper:

TemplateSettings-egenskaper är alltid avsedda att användas i XAML, inte kod. De är skrivskyddade underegenskaper för en skrivskyddad TemplateSettings-egenskap för en överordnad kontroll. För ett avancerat scenario med anpassad kontroll, där du skapar en ny klass baserad på Control och därmed kan påverka kontrollens logik, kan du överväga att definiera en anpassad TemplateSettings-egenskap på kontrollen för att kommunikera information som kan vara användbar för alla som skapar egna mallar för kontrollen. Som det skrivskyddade värdet av egenskapen definierar du en ny TemplateSettings-klass, relaterad till din kontroll, som har skrivskyddade egenskaper för vart och ett av de informationsobjekt som är relevanta för mallmätningar, animationers positionering med mera, och ger anropare en instans av den klassen under körning, initierad av din kontrolllogik. TemplateSettings-klasser härleds från DependencyObject, så att egenskaperna kan använda beroendeegenskapssystemet för egenskaps ändrade återanrop. Men beroendeegenskapsidentifierarna för egenskaperna exponeras inte som offentligt API eftersom egenskaperna TemplateSettings är avsedda att vara skrivskyddade för anropare.

Använda TemplateSettings i en kontrollmall

Här är ett exempel som kommer från startstandarden för XAML-kontrollmallar. Den här är från standardmallen för ProgressRing:

<Ellipse
    x:Name="E1"
    Style="{StaticResource ProgressRingEllipseStyle}"
    Width="{Binding RelativeSource={RelativeSource TemplatedParent}, 
        Path=TemplateSettings.EllipseDiameter}"
    Height="{Binding RelativeSource={RelativeSource TemplatedParent}, 
        Path=TemplateSettings.EllipseDiameter}"
    Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, 
        Path=TemplateSettings.EllipseOffset}"
    Fill="{TemplateBinding Foreground}"/>

Den fullständiga XAML för ProgressRing-mallen är hundratals rader, så det här är bara ett litet utdrag. Denna XAML definierar en kontrolldel som är ett av 6 Ellipselement som visar den snurrande animeringen för obestämda framsteg. Som utvecklare kanske du inte gillar cirklarna och kan använda en annan grafikprimant eller en annan grundläggande form för hur animeringen fortskrider. Du kan till exempel skapa en ProgressRing som använder en uppsättning rektangelelement ordnade i en fyrkant i stället. I så fall kan varje enskild rektangelkomponent i den nya mallen se ut så här:

<Rectangle
    x:Name="R1"
    Width="{Binding RelativeSource={RelativeSource TemplatedParent}, 
        Path=TemplateSettings.EllipseDiameter}"
    Height="{Binding RelativeSource={RelativeSource TemplatedParent}, 
        Path=TemplateSettings.EllipseDiameter}"
    Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, 
        Path=TemplateSettings.EllipseOffset}"
    Fill="{TemplateBinding Foreground}"/>

Anledningen till att egenskaperna TemplateSettings är användbara här är att de är beräknade värden som kommer från den grundläggande kontrolllogik för ProgressRing. Beräkningen delar upp den övergripande ActualWidth och ActualHeight för ProgressRing och tilldelar en beräknad mätning för vart och ett av rörelseelementen i mallarna så att malldelarna kan storleksanpassas till innehåll.

Här är ett annat exempel på användning från XAML-standardkontrollmallarna, vilket den här gången visar en av de egenskapsuppsättningar som utgör Från och Till i en animering. Detta kommer från Standardmallen för ComboBox :

<VisualStateGroup x:Name="DropDownStates">
    <VisualState x:Name="Opened">
        <Storyboard>
            <SplitOpenThemeAnimation
               OpenedTargetName="PopupBorder"
               ContentTargetName="ScrollViewer"
               ClosedTargetName="ContentPresenter"
               ContentTranslationOffset="0"
               OffsetFromCenter="{Binding RelativeSource={RelativeSource TemplatedParent}, 
                 Path=TemplateSettings.DropDownOffset}"
               OpenedLength="{Binding RelativeSource={RelativeSource TemplatedParent}, 
                 Path=TemplateSettings.DropDownOpenedHeight}"
               ClosedLength="{Binding RelativeSource={RelativeSource TemplatedParent},
                 Path=TemplateSettings.DropDownClosedHeight}" />
        </Storyboard>
   </VisualState>
...
</VisualStateGroup>

Återigen finns det massor av XAML i mallen så vi visar bara ett utdrag. Och detta är bara en av flera tillstånd och temaanimeringar som var och en använder samma ComboBoxTemplateSettings-egenskaper . För ComboBox använder du värdena från ComboBoxTemplateSettings via bindningar, vilket säkerställer att relaterade animeringar i mallen stoppas och startas vid positioner baserade på delade värden, och att övergången sker smidigt.

Anmärkning

När du använder TemplateSettings-värden som en del av kontrollmallen kontrollerar du att du anger egenskaper som matchar typen av värde. Annars kan du behöva skapa en värdekonverterare för bindningen så att bindningens måltyp kan konverteras från en annan källtyp av värdet TemplateSettings . Mer information finns i IValueConverter.