Třídy nastavení šablony

Požadavky

Předpokládáme, že do uživatelského rozhraní můžete přidat ovládací prvky, nastavit jejich vlastnosti a připojit obslužné rutiny událostí. Pokyny pro přidání ovládacích prvků do aplikace najdete v tématu Přidání ovládacích prvků a zpracování událostí. Předpokládáme také, že znáte základy definování vlastní šablony pro ovládací prvek tak, že vytvoříte kopii výchozí šablony a upravíte ji. Další informace o tom najdete v tématu Ovládací šablony.

Scénář pro třídy TemplateSettings

Třídy TemplateSettings poskytují sadu vlastností, které se používají při definování nové šablony ovládacího prvku pro ovládací prvek. Vlastnosti mají hodnoty, jako jsou rozměry pixelů pro velikost určitých částí prvků uživatelského rozhraní. Hodnoty jsou někdy vypočítané hodnoty, které vyplývají z řídicí logiky, kterou není snadné ji přepsat nebo dokonce k ní získat přístup. Některé vlastnosti jsou určeny jako From a To hodnoty, které řídí přechody a animace komponent, a tak relevantní vlastnosti TemplateSettings přicházejí ve dvojicích.

Existuje několik tříd TemplateSettings . Všechny jsou v Xaml.Controls.Primitives namespacu. Každá třída má přidruženou TemplateSettings vlastnost příslušného ovládacího prvku. Tato Vlastnost TemplateSettings je způsob, jakým přistupujete k hodnotám TemplateSettings pro ovládací prvek a lze vytvořit vazby šablony na její vlastnosti.

Tady je několik příkladů souvisejících tříd a vlastností:

Vlastnosti TemplateSettings jsou vždy určeny k použití v XAML, nikoli v kódu. Jedná se o dílčí vlastnosti pouze pro čtení v rámci vlastnosti TemplateSettings, která je rovněž pouze pro čtení, nadřazeného ovládacího prvku. V případě pokročilého scénáře vlastního ovládacího prvku, kdy vytváříte novou třídu založenou na control, a proto můžete ovlivnit logiku ovládacího prvku, zvažte definování vlastní vlastnosti TemplateSettings na ovládacím prvku, aby bylo možné sdělit informace, které mohou být užitečné pro každého, kdo ovládací prvek znovu šablonuje. Vzhledem k tomu, že hodnota této vlastnosti je určena jen pro čtení, definujte novou třídu TemplateSettings související s vaším ovládacím prvek, který má vlastnosti jen pro čtení pro každou z položek informací, které jsou relevantní pro měření šablony, umístění animace atd., a poskytněte volajícím instanci modulu runtime této třídy, která je inicializována pomocí řídicí logiky. Třídy TemplateSettings jsou odvozeny z DependencyObject, takže vlastnosti mohou používat systém vlastností závislost pro zpětné volání změněné vlastností. Identifikátory vlastností závislostí nejsou poskytnuté jako veřejné API, protože vlastnosti TemplateSettings mají být pro volající pouze pro čtení.

Jak používat TemplateSettings v šabloně ovládacího prvku

Tady je příklad, který pochází z výchozích šablon ovládacího prvku XAML. Tato konkrétní šablona pochází z výchozí šablony 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}"/>

Úplný kód XAML pro šablonu ProgressRing je stovky řádků, takže je to jen malý výňatek. Tento XAML definuje řídicí část, která je jedním ze 6 prvků elipsy , které znázorňují rotující animaci pro neurčitý průběh. Jako vývojář se vám nemusí líbit kruhy a pro průběh animace můžete použít jinou primitivní grafiku nebo jiný základní tvar. Můžete například vytvořit ProgressRing , který místo toho používá sadu prvků obdélníku uspořádaných na čtverec. Pokud ano, může každá jednotlivá součást obdélníku nové šablony vypadat takto:

<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}"/>

Důvodem, proč jsou zde vlastnosti TemplateSettings užitečné, je to proto, že se jedná o počítané hodnoty pocházející ze základní řídicí logiky ProgressRing. ** Výpočet rozděluje celkový ActualWidth a ActualHeightProgressRingu a přiděluje vypočítané míry jednotlivým prvkům pohybu v jeho šablonách, aby části šablony mohly být přizpůsobeny velikosti obsahu.

Tady je další příklad použití z výchozích šablon ovládacích prvků XAML, který tentokrát ukazuje jednu ze sad vlastností, které určují From a To animace. Toto je z výchozí šablony 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>

V šabloně je opět spousta XAML, takže zobrazujeme jenom výňatek. A to je pouze jeden z několika stavů a animací motivu, které používají stejné vlastnosti ComboBoxTemplateSettings. Pro ComboBox používání hodnot z ComboBoxTemplateSettings prostřednictvím vazeb vynucuje, že související animace v šabloně se zastaví a začnou na pozicích, které jsou založené na sdílených hodnotách, a tak hladce přecházejí.

Poznámka:

Pokud jako součást šablony ovládacího prvku použijete hodnoty TemplateSettings , ujistěte se, že nastavujete vlastnosti, které odpovídají typu hodnoty. Pokud ne, možná budete muset pro vazbu vytvořit převaděč hodnot, aby cílový typ vazby mohl být převeden z jiného typu zdroje hodnoty TemplateSettings . Další informace najdete v tématu IValueConverter.