首页 > 解决方案 > 如何将基于触发器属性的样式应用于内容控件?

问题描述

在我正在处理的当前 WPF 应用程序中,我必须在按下鼠标时反转图标的颜色(当属性 isPressed=true 时)。我需要这样做的原因是我想保持应用程序在图标颜色和背景方面的一致性。但是此图标嵌入在一个按钮中,单击该按钮时会显示相似的颜色,因此该图标不可见

当我的样式触发器拾取我设置的红色但几何图形的颜色没有改变时。有什么方法可以在(isPressed = true)时使用这种样式触发器将几何图形的颜色也设置为红色?

这是我的代码

我的风格如下

    <Style x:Key="ButtonBackground" TargetType="{x:Type Button}">

        <Style.Triggers>
            <Trigger Property="IsPressed" Value="True">
                <Setter Property="Foreground" Value="Red" />
                <Setter Property="Content" Value="yellow" />
            </Trigger>
        </Style.Triggers>
    </Style>

我尝试将 setter 属性设置为黄色,以查看它是否有效,但它不起作用

正在使用的部分如下

<Border BorderBrush="{StaticResource ContentBackground}" BorderThickness="0,0,0,1">
            <Button
                x:Name="NameButton" 

                Style="{StaticResource ButtonBackground}"
                >


                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>

                    <StackPanel Grid.Column="0" Orientation="Horizontal">
                        <ContentControl x:Name="Icon"
                                        Width="25"
                                        Height="25"
                                        ">

                        </ContentControl>
                        <TextBlock Text="{Binding Name}"
                                "/>
                    </StackPanel>

                </Grid>

            </Button>
        </Border>

如图所示,样式也被文本块拾取,但我不知道如何将此样式添加到具有图标的内容控件中

编辑:- 应用程序中指定的图标示例

    <DataTemplate x:Key="FolderIcon">
        <Path 
              Fill="#047F89"
              Data="....."/>
    </DataTemplate>

标签: c#wpfxaml

解决方案


您必须将 的Fill属性绑定Path到父Control元素的Control.Foreground(或Button.Foreground)而不是直接设置它。现在图标颜色将适应Foreground触发器分配的值。我还删除了多余Grid的 theButton.Content和 the Content Setter,因为它会在每次按下时Trigger删除图标元素并将默认值添加到 Style (从Style-Setter 移动):PathButtonForgroundPath.Fill

<Style x:Key="ButtonBackground" TargetType="{x:Type Button}">
  <Setter Property="Foreground" Value="#047F89" />

  <Style.Triggers>
    <Trigger Property="IsPressed" Value="True">
      <Setter Property="Foreground" Value="Red" />
     </Trigger>
  </Style.Triggers>
</Style>

<Button x:Name="NameButton"        
        Style="{StaticResource ButtonBackground}">
  <Button.Content>
    <StackPanel Orientation="Horizontal">
      <Path Fill="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Control}, Path=Foreground}"
            Height="16"
            Width="16"
            Stretch="Uniform"
            VerticalAlignment="Center"
            Margin="5,0,0,0"
            Data="....."/>

      <TextBlock Text="{Binding Name}"
                 TextTrimming="WordEllipsis"
                 VerticalAlignment="Center" 
                 Margin="5,0,0,0"/>
    <StackPanel>
  <Button.Content>
</Button>

如果您决定将Bindingon移至.Path.FillPathResourceDictionary


推荐阅读