Como criar WPF ControlTemplate

Como faço um botão WPF parecer um link?

1) eu criei o UserControl, o XAML predefinido com esse aspecto:

 <UserControl x:Class="Wpf.Controls.HyperlinkLikeButtonTemplate"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>

    </Grid>
</UserControl>

2) eu coloquei ControlTemplate dentro

<UserControl x:Class="Wpf.Controls.HyperlinkLikeButtonTemplate"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">

        <ControlTemplate x:Key="HyperlinkLikeButtonTemplate" TargetType="{x:Type Button}">
            <TextBlock x:Name="innerText" Foreground="{DynamicResource {x:Static SystemColors.HotTrackBrushKey}}" Cursor="Hand" >
        <ContentPresenter />
            </TextBlock>
            <ControlTemplate.Triggers>
                <Trigger Property="Button.IsMouseOver" Value="true">
                    <Setter TargetName="innerText" Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
                    <Setter TargetName="innerText" Property="TextDecorations" Value="Underline" />
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>

        <Style x:Key="HyperlinkLikeButton" TargetType="{x:Type Button}">
            <Setter Property="Template" Value="{StaticResource HyperlinkLikeButtonTemplate}" />
        </Style>
</UserControl>

mas obter erro a propriedade "Content" só pode ser definida uma vez.

Parece que a minha mãe está a fazer algo de errado?

 6
Author: Community, 2013-09-11

3 answers

Você não pode definir estilos ou modelos no seu UserControl, você tem que definir os seus recursos. Além disso, a maioria dos controlos só pode ter um conteúdo. O conteúdo do seu UserControl é um ControlTemplate e um estilo, isso não é permitido porque o interpretador não sabe qual pode ser atribuído como conteúdo.

Tente adicionar marcas <UserControl.Resources>.

Editar: além disso, seu UserControl não tem controles nele, você deve dividi-lo em recursos (estilos, modelos, etc.) e Controlo. Você definiu os estilos para o seu botão. Mas não há nenhum botão atualmente (essa é a razão pela qual havia um Grid no modelo padrão).

<UserControl x:Class="Wpf.Controls.HyperlinkLikeButtonTemplate"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
  <!-- Resources of your control, dictionaries, styles, etc. -->
  <UserControl.Resources>
    <ControlTemplate x:Key="HyperlinkLikeButtonTemplate" TargetType="{x:Type Button}">
        <TextBlock x:Name="innerText" Foreground="{DynamicResource {x:Static SystemColors.HotTrackBrushKey}}" Cursor="Hand" >
    <ContentPresenter />
        </TextBlock>
        <ControlTemplate.Triggers>
            <Trigger Property="Button.IsMouseOver" Value="true">
                <Setter TargetName="innerText" Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
                <Setter TargetName="innerText" Property="TextDecorations" Value="Underline" />
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>

    <Style x:Key="HyperlinkLikeButton" TargetType="{x:Type Button}">
        <Setter Property="Template" Value="{StaticResource HyperlinkLikeButtonTemplate}" />
    </Style>
  </UserControl.Resources>

  <!-- Controls that are in your UserControl -->
  <Button Style="{StaticResource HyperlinkLikeButton}"/>
</UserControl>
Tecnicamente, não precisarias de um controlo próprio do utilizador. você poderia usar o seu modelo e estilo em um desenvoltura e atribuir o estilo como recurso para usar o HyperlinkButton.
 11
Author: Herm, 2013-09-11 20:18:02
Tenta isto, está a funcionar com precisão.
 <ControlTemplate x:Key="ct" TargetType="{x:Type Button}">
    <ControlTemplate.Triggers>
        <Trigger Property="IsPressed" Value="True" >
            <Setter Property="Background" Value="Red"></Setter>
            <Setter Property="Foreground" Value="Black"></Setter>
        </Trigger>
      <Trigger Property="IsMouseOver" Value="True" >
            <Setter Property="Background" Value="Green"></Setter>
            <Setter Property="Foreground" Value="Blue"></Setter>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>
 1
Author: KaluSinghRao, 2014-05-13 09:44:48

Quando a marca ControlTemplate está diretamente sob a marca, ela está sendo refeita como o conteúdo do UserControl. Tem de adicionar o UserControl.Marca de modelo e, em seguida, colocar a marca ControlTemplate.

 0
Author: Programmer, 2013-09-12 05:37:05