所以我有按钮及其样式:
<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="√" />
<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="√" />
<TextBlock Text="{TemplateBinding Button.Content}" />
</StackPanel>
</Setter.Value>
</Setter>
</Style>
然后我得到了这个结果:
正如您所看到的,这与缺少复选标记的firstresult类似
答案 0 :(得分:4)
默认Button
的外观和功能在ControlTemplate
的默认Button
中定义(您可以在MSDN的Button Styles and Templates页面中找到)。当您更改ControlTemplate
时,默认的外观和行为现已消失,并替换为普通的StackPanel
和TextBlock
元素。
为控件提供新的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获取基本模板并对其进行修改,而不是从头开始。您可以在此处找到按钮模板: