C# 一个按钮上有多种样式和内容

C# 一个按钮上有多种样式和内容,c#,wpf,xaml,C#,Wpf,Xaml,我有一个主页,上面有许多按钮,我正在尝试做一些事情。首先,我在ResourceDictionary中有一个样式,它决定了按钮的整体“外观”。看起来是这样的: <Style TargetType="Button" x:Key="HomeButton"> <Setter Property="Foreground" Value="White"/> <Setter Property="Background" Value="#06658D"/>

我有一个
主页
,上面有许多按钮,我正在尝试做一些事情。首先,我在
ResourceDictionary
中有一个
样式
,它决定了按钮的整体“外观”。看起来是这样的:

<Style TargetType="Button" x:Key="HomeButton">
    <Setter Property="Foreground" Value="White"/>
    <Setter Property="Background" Value="#06658D"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border Background="{TemplateBinding Background}" BorderBrush="White" BorderThickness="1">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="FontWeight" Value="Bold"/>
            <Setter Property="Background" Value="White"/>
            <Setter Property="Foreground" Value="#06658D"/>
        </Trigger>
    </Style.Triggers>
</Style>
<Button Grid.Row="0" Style="{StaticResource HomeButton}" Content="Contacts">
    <Style TargetType="{x:Type Button}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding ContactsClicked}" Value="True">
                <Setter Property="Background" Value="White"/>
                <Setter Property="Foreground" Value="#06658D"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Button>

没有什么太复杂的,但是我希望鼠标悬停效果在被点击后保持不变。因此,现在我正在考虑这样做:

<Style TargetType="Button" x:Key="HomeButton">
    <Setter Property="Foreground" Value="White"/>
    <Setter Property="Background" Value="#06658D"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border Background="{TemplateBinding Background}" BorderBrush="White" BorderThickness="1">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="FontWeight" Value="Bold"/>
            <Setter Property="Background" Value="White"/>
            <Setter Property="Foreground" Value="#06658D"/>
        </Trigger>
    </Style.Triggers>
</Style>
<Button Grid.Row="0" Style="{StaticResource HomeButton}" Content="Contacts">
    <Style TargetType="{x:Type Button}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding ContactsClicked}" Value="True">
                <Setter Property="Background" Value="White"/>
                <Setter Property="Foreground" Value="#06658D"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Button>

我将绑定按钮的command元素以设置
ContactsClicked=true
,并在按下另一个按钮时重置此设置。但是,我得到的错误是内容设置了多次

是否可以设置
按钮的整体
样式
,以及“点击
样式”和一次在按钮上显示文本的
TextBlock
,或者我的做法是错误的?我尽量不让每一个
按钮都有一个单独的整体风格,因为这是大量重复的代码

为清晰起见,这是我的目标:


我想将此作为评论添加,但我不允许这样做

如果您的目标是按钮单击后保持选中状态,为什么不使用
单选按钮
单选按钮
有一个名为
IsChecked
的内置属性,但即使在多次单击后也将保持“选中”或“选中”

当然,您可以以类似的方式定义行为和样式,在属性
IsChecked
上创建一个简单的
Trigger


如果需要更多的解释,就这么说。

我自己设法找到了一个解决方案,而不是使用
按钮
us a
切换按钮

<Style TargetType="ToggleButton" x:Key="HomeButton">
    <Setter Property="Foreground" Value="White"/>
    <Setter Property="Background" Value="#06658D"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ToggleButton}">
                <Border Background="{TemplateBinding Background}" BorderBrush="White" BorderThickness="1">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsPressed" Value="True">
                        <Setter Property="Background" Value="Black" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="FontWeight" Value="Bold"/>
            <Setter Property="Background" Value="White"/>
            <Setter Property="Foreground" Value="#06658D"/>
        </Trigger>
        <Trigger Property="IsChecked" Value="True">
            <Setter Property="FontWeight" Value="Bold"/>
            <Setter Property="Background" Value="White"/>
            <Setter Property="Foreground" Value="#06658D"/>
        </Trigger>
    </Style.Triggers>
</Style>


谢谢您的回答:)。我还没有想过使用
单选按钮
实际上,有没有可能用普通按钮的方式来设计它呢?例如,我是否可以删除表示是否选中的常用圆圈?我很难想象我怎么能把它设计成上面的样子。当然!你可以把任何东西设计成任何东西,按钮实际上是最简单的。以下是控件模板:。请小心删除不需要的内容。我可以给你一个完整的例子,如果需要的话,哇,这似乎是一个疯狂的代码量,只是为了我改变一个按钮的背景为白色时,点击!一定有更简单的方法…事实上,没有。相信我,我知道我在说什么。记住这一点,您应该删除我提到的大部分代码。所有与VisualStatesManager相关的内容都可以使用按钮。我正准备从你那里提出一些建议。不管怎样,很高兴你明白了:)