WPF按钮样式和模板

时间:2014-08-19 15:35:43

标签: c# wpf xaml templatebinding

所以我有按钮及其样式:

<Style TargetType="Button" x:Key="BaseButtonStyle">
    <Setter Property="FontWeight" Value="Bold"  />
    <Setter Property="Width" Value="120" />
    <Setter Property="Height" Value="30" />
    <Setter Property="BorderBrush" Value="#1FA3FF"  />
</Style>

<Style TargetType="{x:Type Button}" x:Key="MyButtonStyle"  BasedOn="{StaticResource BaseButtonStyle}">          
    <Setter Property="Background" Value="#1FA3EB"  />
    <Setter Property="Foreground" Value="#FFFFFF"  />
</Style>

<Button Style="{StaticResource MyButtonStyle}" Content="My text" />

它工作正常,我有以下结果(海蓝宝石背景不是Button的一部分,它属于Window):

enter image description here

但是我想替换按钮的内容并改变我的风格:

<Style TargetType="{x:Type Button}" x:Key="MyButtonStyle"  BasedOn="{StaticResource BaseButtonStyle}">          
    <Setter Property="Background" Value="#1FA3EB"  />
    <Setter Property="Foreground" Value="#FFFFFF"  />

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="√" />
                    <TextBlock Text="{TemplateBinding Button.Content}" />
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

现在我的按钮变得很糟糕了:

enter image description here

正如您所看到的,我的按钮丢失了边框和背景,当鼠标悬停在它上面时,它不会改变视图。我哪里错了,我应该怎么做才能防止它?

UPD

当我做这样的事情时:

<Style TargetType="{x:Type Button}" x:Key="MyButtonStyle"  BasedOn="{StaticResource BaseButtonStyle}">          
    <Setter Property="Background" Value="#1FA3EB"  />
    <Setter Property="Foreground" Value="#FFFFFF"  />
    <Setter Property="Content" >
        <Setter.Value>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="√" />
                <TextBlock Text="{TemplateBinding Button.Content}" />
            </StackPanel>
        </Setter.Value>
    </Setter>
</Style>

然后我得到了这个结果:

enter image description here

正如您所看到的,这与缺少复选标记的firstresult类似

2 个答案:

答案 0 :(得分:4)

默认Button的外观和功能在ControlTemplate的默认Button中定义(您可以在MSDN的Button Styles and Templates页面中找到)。当您更改ControlTemplate时,默认的外观和行为现已消失,并替换为普通的StackPanelTextBlock元素。

为控件提供新的ControlTemplate时,最好从默认的ControlTemplate开始,然后进行小的更改,直到获得所需的外观。以下是Style的略微扩展,它提供了一些基本的鼠标悬停功能:

<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate>
            <Border BorderBrush="Black" BorderThickness="1" CornerRadius="3">
                <Border.Style>
                    <Style TargetType="{x:Type Border}">
                        <Setter Property="Background" Value="LightBlue" />
                        <Style.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Background" Value="LightGreen" />
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </Border.Style>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="√" />
                <TextBlock Text="{TemplateBinding Button.Content}" />
                </StackPanel>
            </Border>
        </ControlTemplate>
    </Setter.Value>
</Setter>

您可以在MSDN上的ControlTemplate Class页面上找到有关ControlTemplate的更多信息。

答案 1 :(得分:2)

如果您只需要更改按钮的内容,可以这样做:

<Button Style="{StaticResource BaseButtonStyle}">
    <!-- This is the content -->
    <StackPanel Orientation="Horizontal">
        <TextBlock Text="√" />
        <TextBlock Text="{Binding ButtonTextBinding}" />
    </StackPanel>
</Button>

这样你就不会失去基本造型。按钮内容属性是一个对象,因此它需要任何东西。 当您更改按钮的控件模板时,有关背景,边框,鼠标悬停,按下状态等的所有内容都将丢失。重新设置任何WPF控件的最佳方法是从MSDN获取基本模板并对其进行修改,而不是从头开始。您可以在此处找到按钮模板:

.NET 4.5 Button template