ControlTemplate Classe

Definição

Especifica a estrutura visual e os aspetos comportamentais de um Control que podem ser partilhados entre múltiplas instâncias do controlo.

public ref class ControlTemplate : System::Windows::FrameworkTemplate
[System.Windows.Localizability(System.Windows.LocalizationCategory.None, Readability=System.Windows.Readability.Unreadable)]
[System.Windows.Markup.DictionaryKeyProperty("TargetType")]
public class ControlTemplate : System.Windows.FrameworkTemplate
[<System.Windows.Localizability(System.Windows.LocalizationCategory.None, Readability=System.Windows.Readability.Unreadable)>]
[<System.Windows.Markup.DictionaryKeyProperty("TargetType")>]
type ControlTemplate = class
    inherit FrameworkTemplate
Public Class ControlTemplate
Inherits FrameworkTemplate
Herança
Atributos

Exemplos

O seguinte mostra um ButtonStyle que define o ControlTemplate de um Button:

<Style TargetType="Button">
  <!--Set to true to not get any properties from the themes.-->
  <Setter Property="OverridesDefaultStyle" Value="True"/>
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="Button">
        <Grid>
          <Ellipse Fill="{TemplateBinding Background}"/>
          <ContentPresenter HorizontalAlignment="Center"
                            VerticalAlignment="Center"/>
        </Grid>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

Quando isto é aplicado, o Button aparece como um Ellipse:

Exemplo de Button ControlTemplate

Quando defines a Template propriedade de Control a para a nova ControlTemplate , como no exemplo acima, estás a substituir todo o template. O aspeto Button quando está focado ou pressionado faz parte do aspeto padrão do botão que está a substituir. Portanto, dependendo das suas necessidades, pode querer colocar na sua definição como deve ser o seu botão quando é pressionado, e assim sucessivamente, como no seguinte exemplo:

<Style TargetType="Button">
  <Setter Property="SnapsToDevicePixels"
          Value="true" />
  <Setter Property="OverridesDefaultStyle"
          Value="true" />
  <Setter Property="FocusVisualStyle"
          Value="{StaticResource ButtonFocusVisual}" />
  <Setter Property="MinHeight"
          Value="23" />
  <Setter Property="MinWidth"
          Value="75" />
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="Button">
        <Border TextBlock.Foreground="{TemplateBinding Foreground}"
                x:Name="Border"
                CornerRadius="2"
                BorderThickness="1">
          <Border.BorderBrush>
            <LinearGradientBrush StartPoint="0,0"
                                 EndPoint="0,1">
              <LinearGradientBrush.GradientStops>
                <GradientStopCollection>
                  <GradientStop Color="{DynamicResource BorderLightColor}"
                                Offset="0.0" />
                  <GradientStop Color="{DynamicResource BorderDarkColor}"
                                Offset="1.0" />
                </GradientStopCollection>
              </LinearGradientBrush.GradientStops>
            </LinearGradientBrush>

          </Border.BorderBrush>
          <Border.Background>
            <LinearGradientBrush EndPoint="0.5,1"
                                 StartPoint="0.5,0">
              <GradientStop Color="{DynamicResource ControlLightColor}"
                            Offset="0" />
              <GradientStop Color="{DynamicResource ControlMediumColor}"
                            Offset="1" />
            </LinearGradientBrush>
          </Border.Background>
          <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="CommonStates">
              <VisualStateGroup.Transitions>
                <VisualTransition GeneratedDuration="0:0:0.5" />
                <VisualTransition GeneratedDuration="0"
                                  To="Pressed" />
              </VisualStateGroup.Transitions>
              <VisualState x:Name="Normal" />
              <VisualState x:Name="MouseOver">
                <Storyboard>
                  <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).
                      (GradientBrush.GradientStops)[1].(GradientStop.Color)"
                                                Storyboard.TargetName="Border">
                    <EasingColorKeyFrame KeyTime="0"
                                         Value="{StaticResource ControlMouseOverColor}" />
                  </ColorAnimationUsingKeyFrames>
                </Storyboard>
              </VisualState>
              <VisualState x:Name="Pressed">
                <Storyboard>
                  <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).
                      (GradientBrush.GradientStops)[1].(GradientStop.Color)"
                                                Storyboard.TargetName="Border">
                    <EasingColorKeyFrame KeyTime="0"
                                         Value="{StaticResource ControlPressedColor}" />
                  </ColorAnimationUsingKeyFrames>
                  <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).
                      (GradientBrush.GradientStops)[0].(GradientStop.Color)"
                                                Storyboard.TargetName="Border">
                    <EasingColorKeyFrame KeyTime="0"
                                         Value="{StaticResource PressedBorderDarkColor}" />
                  </ColorAnimationUsingKeyFrames>
                  <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).
                      (GradientBrush.GradientStops)[1].(GradientStop.Color)"
                                                Storyboard.TargetName="Border">
                    <EasingColorKeyFrame KeyTime="0"
                                         Value="{StaticResource PressedBorderLightColor}" />
                  </ColorAnimationUsingKeyFrames>
                </Storyboard>
              </VisualState>
              <VisualState x:Name="Disabled">
                <Storyboard>
                  <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).
                      (GradientBrush.GradientStops)[1].(GradientStop.Color)"
                                                Storyboard.TargetName="Border">
                    <EasingColorKeyFrame KeyTime="0"
                                         Value="{StaticResource DisabledControlDarkColor}" />
                  </ColorAnimationUsingKeyFrames>
                  <ColorAnimationUsingKeyFrames
                      Storyboard.TargetProperty="(TextBlock.Foreground).(SolidColorBrush.Color)"
                                                Storyboard.TargetName="Border">
                    <EasingColorKeyFrame KeyTime="0"
                                         Value="{StaticResource DisabledForegroundColor}" />
                  </ColorAnimationUsingKeyFrames>
                  <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).
                      (GradientBrush.GradientStops)[1].(GradientStop.Color)"
                                                Storyboard.TargetName="Border">
                    <EasingColorKeyFrame KeyTime="0"
                                         Value="{StaticResource DisabledBorderDarkColor}" />
                  </ColorAnimationUsingKeyFrames>
                </Storyboard>
              </VisualState>
            </VisualStateGroup>
          </VisualStateManager.VisualStateGroups>
          <ContentPresenter Margin="2"
                            HorizontalAlignment="Center"
                            VerticalAlignment="Center"
                            RecognizesAccessKey="True" />
        </Border>
        <ControlTemplate.Triggers>
          <Trigger Property="IsDefault"
                   Value="true">

            <Setter TargetName="Border"
                    Property="BorderBrush">
              <Setter.Value>
                <LinearGradientBrush StartPoint="0,0"
                                     EndPoint="0,1">
                  <GradientBrush.GradientStops>
                    <GradientStopCollection>
                      <GradientStop Color="{DynamicResource DefaultBorderBrushLightBrush}"
                                    Offset="0.0" />
                      <GradientStop Color="{DynamicResource DefaultBorderBrushDarkColor}"
                                    Offset="1.0" />
                    </GradientStopCollection>
                  </GradientBrush.GradientStops>
                </LinearGradientBrush>

              </Setter.Value>
            </Setter>
          </Trigger>
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

Note que este exemplo faz referência a recursos que não são apresentados aqui. Para o exemplo completo, veja Styling with ControlTemplates Sample. Esse exemplo fornece exemplos de modelos de controlo para muitos controlos e é a melhor forma de começar a criar modelos de controlo.

Observações

Permite-te ControlTemplate especificar a estrutura visual de um controlo. O autor do controlo pode definir o padrão ControlTemplate e o autor da aplicação pode sobrepor o ControlTemplate para reconstruir a estrutura visual do controlo.

A modelação de controlo é uma das muitas funcionalidades oferecidas pelo modelo de estilo e modelação WPF. O modelo de estilização e modelagem proporciona-lhe uma flexibilidade tão grande que, em muitos casos, não precisa de escrever os seus próprios controlos. Se é um autor de aplicação que quer alterar a visualização do seu controlo ou substituir a ControlTemplate de um controlo existente, consulte o tópico Styling and Templating para exemplos e uma discussão aprofundada.

Se está a escrever o seu próprio controlo, consulte "Criar um Controlo Personalizado" na Visão Geral de Autoria de Controlo.

A destina-se a ser uma unidade autónoma de detalhe ControlTemplate de implementação invisível para utilizadores externos e objetos, incluindo estilos. A única forma de manipular o conteúdo do modelo de controlo é dentro do mesmo modelo de controlo.

Uso do elemento de propriedade XAML

<ControlTemplate>
  <VisualTreeRootNode>
    VisualTreeNodeContents
  </VisualTreeRootNode>
</ControlTemplate>

Valores XAML

ControlTemplate Elemento objeto para ControlTemplate ou uma classe derivada.

VisualTreeRootNode Um único elemento XAML como filho imediato da ControlTemplate (ou uma classe derivada). Os templates devem ter um único nó raiz. Para gerar um modelo útil, espera-se que o elemento escolhido como VisualTreeRootNode suporte um modelo de conteúdo próprio, frequentemente um modelo que suporta múltiplos elementos filhos.

VisualTreeNodeConteúdos Um ou mais elementos que completam o modelo pretendido. Se o elemento escolhido como VisualTreeRootNode suportar apenas um filho, então só pode haver um elemento declarado como VisualTreeNodeContents. Também é possível (embora pouco comum) fornecer conteúdo de texto se o VisualTreeRootNode escolhido suportar uma propriedade de conteúdo textual.

Construtores

Name Description
ControlTemplate()

Inicializa uma nova instância da ControlTemplate classe.

ControlTemplate(Type)

Inicializa uma nova instância da ControlTemplate classe com o tipo de alvo especificado.

Propriedades

Name Description
Dispatcher

Percebe o Dispatcher que isto DispatcherObject está associado.

(Herdado de DispatcherObject)
HasContent

Recebe um valor que indica se este modelo tem conteúdo otimizado.

(Herdado de FrameworkTemplate)
IsSealed

Obtém um valor que indica se este objeto está num estado imutável, pelo que não pode ser alterado.

(Herdado de FrameworkTemplate)
Resources

Obtém ou define a coleção de recursos que podem ser usados dentro do âmbito deste modelo.

(Herdado de FrameworkTemplate)
TargetType

Obtém ou define o tipo para o qual isto ControlTemplate se destina.

Template

Obtém ou define uma referência ao objeto que grava ou reproduz os nós XAML do template quando o template é definido ou aplicado por um escritor.

(Herdado de FrameworkTemplate)
Triggers

Obtém uma coleção de TriggerBase objetos que aplicam alterações de propriedades ou realizam ações baseadas em condições especificadas.

VisualTree

Obtém ou define o nó raiz do template.

(Herdado de FrameworkTemplate)

Métodos

Name Description
CheckAccess()

Determina se o thread que chama tem acesso a este DispatcherObject.

(Herdado de DispatcherObject)
Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
FindName(String, FrameworkElement)

Encontra o elemento associado ao nome especificado definido neste modelo.

(Herdado de FrameworkTemplate)
GetHashCode()

Serve como função de hash predefinida.

(Herdado de Object)
GetType()

Obtém o Type da instância atual.

(Herdado de Object)
LoadContent()

Carrega o conteúdo do template como uma instância de um objeto e devolve o elemento raiz do conteúdo.

(Herdado de FrameworkTemplate)
MemberwiseClone()

Cria uma cópia superficial do atual Object.

(Herdado de Object)
RegisterName(String, Object)

Regista um novo par nome/objeto no âmbito de nomes atual.

(Herdado de FrameworkTemplate)
Seal()

Bloqueia o modelo para que não possa ser alterado.

(Herdado de FrameworkTemplate)
ShouldSerializeResources(XamlDesignerSerializationManager)

Devolve um valor que indica se os processos de serialização devem serializar o valor da Resources propriedade em instâncias desta classe.

(Herdado de FrameworkTemplate)
ShouldSerializeVisualTree()

Devolve um valor que indica se os processos de serialização devem serializar o valor da VisualTree propriedade em instâncias desta classe.

(Herdado de FrameworkTemplate)
ToString()

Devolve uma cadeia que representa o objeto atual.

(Herdado de Object)
UnregisterName(String)

Remove um mapeamento nome/objeto do namescope XAML.

(Herdado de FrameworkTemplate)
ValidateTemplatedParent(FrameworkElement)

Verifica o pai template em relação a um conjunto de regras.

VerifyAccess()

Faz cumprir que o thread que chama tem acesso a este DispatcherObject.

(Herdado de DispatcherObject)

Implementações de Interface Explícita

Name Description
INameScope.FindName(String)

Devolve um objeto que tem o nome identificativo fornecido.

(Herdado de FrameworkTemplate)
IQueryAmbient.IsAmbientPropertyAvailable(String)

Consulta se uma propriedade ambiente especificada está disponível no âmbito atual.

(Herdado de FrameworkTemplate)

Aplica-se a

Ver também