Classes TemplateSettings

Pré-requisitos

Presumimos que você saiba adicionar controles à sua interface do usuário, definir as suas propriedades e atribuir manipuladores de eventos. Para obter instruções sobre como adicionar controles ao seu aplicativo, consulte Adicionar controles e manipular eventos. Também presumimos que você tem noções básicas sobre como definir um modelo personalizado para um controle, fazendo uma cópia do modelo padrão e editando-a. Para saber mais sobre isso, consulte Início rápido: modelos de controle.

O cenário para classes TemplateSettings

As classes TemplateSettings fornecem um conjunto de propriedades que são usadas quando você define um novo modelo de controle de um controle. As propriedades têm valores como medidas de pixel para o tamanho de determinadas partes do elemento de interface do usuário. Às vezes, os valores são valores calculados que são provenientes da lógica do controle que normalmente não é fácil de substituir ou até mesmo acessar. Algumas das propriedades servem como valores From e To que controlam as transições e as animações de partes e, portanto, as propriedades TemplateSettings relevantes vêm em pares.

Há várias classes TemplateSettings. Todas elas estão no namespace Windows.UI.Xaml.Controls.Primitives. Aqui está uma lista das classes e um link para a propriedade TemplateSettings do controle relevante. Essa propriedade TemplateSettings é como você acessa os valores TemplateSettings para o controle e pode estabelecer associações de modelo às suas propriedades:

As propriedades TemplateSettings sempre devem ser usadas em XAML, não o código. Elas são subpropriedades somente leitura de uma propriedade TemplateSettings somente leitura de um controle pai. Em um cenário de controle personalizado avançado, no qual você está criando uma nova classe baseada em Control e portanto pode influenciar a lógica do controle, considere a definição de uma propriedade TemplateSettings personalizada no controle para comunicar informações que podem ser úteis para qualquer um que esteja remodelando o controle. Assim como esse valor somente leitura da propriedade, defina uma nova classe TemplateSettings para o seu controle, que tenha propriedades somente leitura para cada um dos itens de informação, seja relevante para as medidas do modelo, posicionamento da animação, e assim por diante, e forneça aos chamados a instância do tempo de execução dessa classe que é inicializada através da lógica do controle. As classes TemplateSettings são derivadas de DependencyObject, de forma que as propriedades possam usar o sistema de propriedade de relevância dos retornos de chamada com propriedade alterada. Mas os identificadores de propriedade de dependência da propriedades não são expostos como API pública, pois as propriedades TemplateSettings não se destinam a ser somente leitura para os chamadores.

Como usar TemplateSettings a um modelo de controle.

Aqui está um exemplo que vêm dos modelos de controle XAML padrão iniciais. Este em especial é do modelo padrão de 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}"/>

O XAML completo do modelo ProgressRing tem centenas de linhas, portanto, este é apenas um trecho minúsculo. Este XAML define a parte de um controle que é um dos 6 elementos Ellipse que representam a animação de rotação de progresso indeterminado. Como desenvolvedor, talvez você não goste de círculos e talvez use um primitivo de elemento gráfico diferente ou uma forma básica distinta para a progressão da animação. Por exemplo, você pode criar um ProgressRing que use um conjunto de elementos Rectangle organizados em um quadrado. Se for o caso, cada componente Rectangle individual de seu novo modelo pode se parecer com o seguinte:

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

O motivo pelo qual as propriedades TemplateSettings são úteis aqui é porque elas são valores calculados vindos da lógica de controle básica de ProgressRing. O cálculo é feito dividindo ActualWidth total e ActualHeight de ProgressRing e distribuindo uma medida calculada de cada um dos elementos de movimento em seu modelo para que as partes do modelo possam acomodar o conteúdo.

Este é outro exemplo de uso dos modelos de controle do padrão XAML, desta vez mostrando um dos conjuntos de propriedades que são From e To de uma animação. Isso provém do modelo padrão 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>

Novamente, existem muitos XAML no modelo, portanto, mostramos apenas um trecho. E este é apenas um dos vários estados e animações de tema que usam as mesmas propriedades ComboBoxTemplateSettings. Para ComboBox, o uso dos valores ComboBoxTemplateSettings por meio de associações reforça que as animações relacionadas no modelo pararão e começarão nas posições que são baseadas em valores compartilhados e, portanto, fazem a transição perfeitamente.

Nota Ao usar valores TemplateSettings como parte do modelo de controle, verifique se você está definindo propriedades que correspondem ao tipo do valor. Caso contrário, talvez você precise criar um conversor de valor para a associação de forma que o tipo de destino da associação possa ser convertido de um tipo de origem diferente do valor TemplateSettings. Para saber mais, consulte IValueConverter.