更改OnClick标签颜色WPF

时间:2013-12-15 12:43:09

标签: c# wpf xaml

我来自C#winforms背景,我通常会在代码中完成所有这些操作。 我有几个标签,我用作菜单。 当鼠标悬停在它们上方时,文本会改变颜色:

<Page.Resources>
    <SolidColorBrush x:Key="normalColor" Color="White" />
    <SolidColorBrush x:Key="mouseOverColor" Color="Gold" />
    <Style TargetType="Label" x:Key="menuItemStyle">
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="False">
                <Setter Property="Foreground" Value="{StaticResource normalColor}"/>
            </Trigger>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Foreground" Value="{StaticResource mouseOverColor}"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</Page.Resources>

      <Label x:Name="Label_Video1" Style="{StaticResource menuItemStyle}" Content="1.Video 1."  FontSize="16" HorizontalAlignment="Left" Margin="25,74,0,0" VerticalAlignment="Top" MouseLeftButtonDown="Label_Video1_MouseLeftButtonDown" />
    <Label x:Name="Label_Video2" Style="{StaticResource menuItemStyle}" Content="2. Video 2." FontSize="16" HorizontalAlignment="Left" Margin="25,105,0,0" VerticalAlignment="Top" MouseDown="Label_Video2_MouseDown"/>

当用户点击标签时,我希望它保持certin颜色(在这种情况下为Gold)以及所有其他颜色以保持其正常颜色。因此,如果先前已经点击过标签,我点击另一个标签,它将从金色变为白色等

1 个答案:

答案 0 :(得分:2)

使用WPF时,您必须略有不同。我们知道Label控件不知道何时被单击,并且它特别不知道何时单击了另一个Label元素...但是有些控件会这样做。考虑一下...... RadioButton正是这种行为。现在这是WPF 真正闪耀的地方。

我们可以使用RadioButton s并为他们提供新的ControlTemplate,我们可以使他们看起来像一样纯文本:

<Grid Background="Black">
    <Grid.Resources>
        <Style TargetType="{x:Type RadioButton}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type RadioButton}">
                        <TextBlock Text="{TemplateBinding Content}">
                            <TextBlock.Style>
                                <Style TargetType="{x:Type TextBlock}">
                                    <Setter Property="Foreground" Value="White" />
                                    <Style.Triggers>
<DataTrigger Binding="{Binding IsChecked, RelativeSource={RelativeSource AncestorType={
x:Type RadioButton}}}" Value="True">
    <Setter Property="Foreground" Value="Gold" />
</DataTrigger>
<DataTrigger Binding="{Binding IsMouseOver, RelativeSource={RelativeSource
AncestorType={x:Type RadioButton}}}" Value="True">
    <Setter Property="Foreground" Value="Gold" />
</DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </TextBlock.Style>
                        </TextBlock>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Grid.Resources>
    <StackPanel Margin="5" Background="{x:Null}">
        <RadioButton Content="1.Video 1." />
        <RadioButton Content="2.Video 2." />
        <RadioButton Content="3.Video 3." />
    </StackPanel>
</Grid>

如果您不希望RadioButton中的StackPanel全部放在一起,那么您可以使用相同的GroupName属性值来确保它们仍然存在作为一个整体运作。