1

所以我有按钮及其样式:

<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):

在此处输入图像描述

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

<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="√&quot; />
                    <TextBlock Text="{TemplateBinding Button.Content}" />
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

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

在此处输入图像描述

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

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="√&quot; />
                <TextBlock Text="{TemplateBinding Button.Content}" />
            </StackPanel>
        </Setter.Value>
    </Setter>
</Style>

然后我得到这个结果:

在此处输入图像描述

如您所见,这类似于第一个结果,其中缺少复选标记

4

2 回答 2

5

默认的外观和功能在默认中Button定义(您可以在 MSDN 上的按钮样式和模板页面中找到)。当您更改 时,默认外观和行为现在消失并替换为您的普通和元素。ControlTemplateButtonControlTemplateStackPanelTextBlock

在为控件提供新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 上的Class页面找到更多关于ControlTemplates 的信息。ControlTemplate

于 2014-08-19T15:48:06.077 回答
3

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

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

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

.NET 4.5 按钮模板

于 2014-08-19T15:45:34.697 回答