WPF按钮样式和模板

Jun*_*222 1 c# wpf xaml templatebinding

所以我有按钮及其样式:

\n
<Style TargetType="Button" x:Key="BaseButtonStyle">\n    <Setter Property="FontWeight" Value="Bold"  />\n    <Setter Property="Width" Value="120" />\n    <Setter Property="Height" Value="30" />\n    <Setter Property="BorderBrush" Value="#1FA3FF"  />\n</Style>\n\n<Style TargetType="{x:Type Button}" x:Key="MyButtonStyle"  BasedOn="{StaticResource BaseButtonStyle}">          \n    <Setter Property="Background" Value="#1FA3EB"  />\n    <Setter Property="Foreground" Value="#FFFFFF"  />\n</Style>\n\n<Button Style="{StaticResource MyButtonStyle}" Content="My text" />\n
Run Code Online (Sandbox Code Playgroud)\n

它工作正常,我得到以下结果(海蓝宝石背景不是按钮的一部分,它属于窗口):

\n

在此输入图像描述

\n

但后来我想替换按钮的内容并更改我的样式:

\n
<Style TargetType="{x:Type Button}" x:Key="MyButtonStyle"  BasedOn="{StaticResource BaseButtonStyle}">          \n    <Setter Property="Background" Value="#1FA3EB"  />\n    <Setter Property="Foreground" Value="#FFFFFF"  />\n\n    <Setter Property="Template">\n        <Setter.Value>\n            <ControlTemplate>\n                <StackPanel Orientation="Horizontal">\n                    <TextBlock Text="\xe2\x88\x9a" />\n                    <TextBlock Text="{TemplateBinding Button.Content}" />\n                </StackPanel>\n            </ControlTemplate>\n        </Setter.Value>\n    </Setter>\n</Style>\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

在此输入图像描述

\n

正如您所看到的,我的按钮失去了边框和背景,并且当鼠标悬停在其上时,它的视图也没有改变。我哪里错了,我应该做什么来防止它?

\n

UPD

\n

当我做这样的事情时:

\n
<Style TargetType="{x:Type Button}" x:Key="MyButtonStyle"  BasedOn="{StaticResource BaseButtonStyle}">          \n    <Setter Property="Background" Value="#1FA3EB"  />\n    <Setter Property="Foreground" Value="#FFFFFF"  />\n    <Setter Property="Content" >\n        <Setter.Value>\n            <StackPanel Orientation="Horizontal">\n                <TextBlock Text="\xe2\x88\x9a" />\n                <TextBlock Text="{TemplateBinding Button.Content}" />\n            </StackPanel>\n        </Setter.Value>\n    </Setter>\n</Style>\n
Run Code Online (Sandbox Code Playgroud)\n

然后我得到这个结果:

\n

在此输入图像描述

\n

正如您所看到的,这与第一个结果类似,其中缺少复选标记

\n

She*_*dan 5

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

\n\n

当提供新的ControlTemplate控件时,最好从默认值开始ControlTemplate并进行一些小的更改,直到获得所需的外观。这是对您的一个轻微的扩展Style,提供了一些基本的鼠标悬停功能:

\n\n
<Setter Property="Template">\n    <Setter.Value>\n        <ControlTemplate>\n            <Border BorderBrush="Black" BorderThickness="1" CornerRadius="3">\n                <Border.Style>\n                    <Style TargetType="{x:Type Border}">\n                        <Setter Property="Background" Value="LightBlue" />\n                        <Style.Triggers>\n                            <Trigger Property="IsMouseOver" Value="True">\n                                <Setter Property="Background" Value="LightGreen" />\n                            </Trigger>\n                        </Style.Triggers>\n                    </Style>\n                </Border.Style>\n            <StackPanel Orientation="Horizontal">\n                <TextBlock Text="\xe2\x88\x9a" />\n                <TextBlock Text="{TemplateBinding Button.Content}" />\n                </StackPanel>\n            </Border>\n        </ControlTemplate>\n    </Setter.Value>\n</Setter>\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n