当按钮被按下时,更改GeometryDrawing Brush的颜色

3

我创建了一个按钮模板。里面有一张图片和一个标签。 这张图片的源文件在资源字典“Pictures”中。图片的源文件是带有白色画笔颜色的DrawingImage。

<DrawingImage x:Key="Moduly">
  <DrawingImage.Drawing>
    <DrawingGroup>
      <GeometryDrawing Brush="{Binding BackgroundColor}" Geometry="M 0,0L 32,0L 32,32L 0,32L 0,0 Z " />
      <GeometryDrawing Brush="{Binding IconColor}" Geometry="M800.336 949.171H184.527c-80.603 0-136.768-65.56-136.768-146.159V203.677  c0-80.602 56.166-152.42 136.768-152.42h615.809c80.598 0 149.289 71.818 149.289 152.42v599.334  C949.625 883.611 880.934 949.171 800.336 949.171L800.336 949.171z M874.488 203.677c0-39.184-34.99-77.287-74.152-77.287H184.527  c-39.166 0-61.632 38.103-61.632 77.287v599.334c0 39.182 22.466 71.024 61.632 71.024h615.809  c39.162 0 74.152-31.843 74.152-71.024V203.677L874.488 203.677z M273.604 613.832h447.829v75.134H273.604V613.832L273.604 613.832z   M273.604 463.566h447.829v75.131H273.604V463.566L273.604 463.566z M273.604 313.295h447.829v75.134H273.604V313.295  L273.604 313.295z" />                   
    </DrawingGroup>
  </DrawingImage.Drawing>     
</DrawingImage>

所有样式(按钮、堆栈面板、标签)的源代码都在资源字典 Styles 中。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
  <Style TargetType="Button">
    <Setter Property="BorderBrush" Value="Black"/>
    <Setter Property="Background" Value="#103255"/>
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="{x:Type Button}">
          <Border Background="{TemplateBinding Background}">
            <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
          </Border>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
    <Style.Resources>        
      <Style TargetType="StackPanel">
        <Style.Resources>
          <Style TargetType="Label">
            <Setter Property="Foreground" Value="White" />
            <Style.Triggers>
              <DataTrigger Binding="{Binding IsPressed, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}"
                           Value="True">
                <Setter Property="Foreground" Value="#103255" />
              </DataTrigger>
            </Style.Triggers>
          </Style>                
        </Style.Resources>
      </Style>
    </Style.Resources>
    <Style.Triggers>
      <Trigger Property="IsMouseOver" Value="True">
        <Setter Property="Background" Value="#103255"/>
        <Setter Property="BorderBrush" Value="Black"/>                
      </Trigger>
      <Trigger Property="IsPressed" Value="True">
        <Setter Property="Background" Value="White"/>
        <Setter Property="BorderBrush" Value="White"/>
      </Trigger>
    </Style.Triggers>
  </Style>        
</ResourceDictionary>

当按钮被按下时,我需要更改DrawingImage的画笔颜色。只更改特定按钮内的图片。

<Button Grid.Column="0" Grid.Row="2" Name="modulyButton"
        HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
        BorderThickness="3" Margin="0,0,0,0">
  <StackPanel Orientation="Vertical" Name="modulyStackPanel"
              HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
    <Image x:Name="modulyImage" Source="{StaticResource Moduly}"
           HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
           Height="30" Width="30"/>
    <Label x:Name="modulyLabel" Content="MODULY"
           VerticalAlignment="Center"/>
  </StackPanel>
</Button>

有没有解决方案?


我尝试创建图像样式触发器。但是出现了问题。图像没有颜色规范。 - Pavel Etrich
请分享一些代码,这不是一个自由的代码工厂。如果我们看到你的代码,就更容易帮助你。 - Massimiliano Kraus
Pavel,不要发布代码的截图。请将代码嵌入到你的问题中,你有一个格式化文本段落为代码的按钮,我相信你已经看过许多其他具有清晰代码部分的StackOverflow问题了。 - Massimiliano Kraus
@MassimilianoKraus 我上传了样式的屏幕截图。向上。我的按钮: - Pavel Etrich
@Clemens
非常抱歉,我已经添加了它。
- Pavel Etrich
显示剩余2条评论
1个回答

4
我认为,按照您创建的结构,无法实现。在编译时,ButtonImage 只知道一个正确类型的StaticResource 被赋给了它的Source 属性,但它不知道这个Source 实例有一个包含两个元素的DrawingGroup,每个元素都有一个Brush属性,因此无法在Image.Triggers中调用该Brush属性。您需要替换整个DrawingImage

我的解决方案(简化版,带有绿色/红色颜色切换):

1)创建两个DrawingImage,具有相同的Geometry但不同的Brush

<DrawingImage x:Key="Moduly1">
  <DrawingImage.Drawing>
    <DrawingGroup>
      <GeometryDrawing Brush="Green" Geometry="M 0,0L 32,0L 32,32L 0,32L 0,0 Z" />
    </DrawingGroup>
  </DrawingImage.Drawing>
</DrawingImage>

<DrawingImage x:Key="Moduly2">
  <DrawingImage.Drawing>
    <DrawingGroup>
      <GeometryDrawing Brush="Red" Geometry="M 0,0L 32,0L 32,32L 0,32L 0,0 Z" />
    </DrawingGroup>
  </DrawingImage.Drawing>
</DrawingImage>

2) 在ResourceDictionary中的ButtonTemplate中,在内部的StackPanel样式中写入以下内容:

<Style TargetType="StackPanel">
  <Style.Resources>
    <Style TargetType="Label">
      <Setter Property="Foreground" Value="White" />
      <Style.Triggers>
        <DataTrigger Binding="{Binding IsPressed,
                        RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}"
                     Value="True">
          <Setter Property="Foreground" Value="#103255" />
        </DataTrigger>
      </Style.Triggers>
    </Style>
    <!-- ADDED PART -->
    <Style TargetType="Image">
      <Setter Property="Source" Value="{StaticResource ResourceKey=Moduly1}"/>
      <Style.Triggers>
        <DataTrigger Binding="{Binding IsPressed,
                        RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}"
                     Value="True">
          <Setter Property="Source" Value="{StaticResource ResourceKey=Moduly2}" />
        </DataTrigger>
      </Style.Triggers>
    </Style>
    <!-- END ADDED PART -->
  </Style.Resources>
</Style>

3)在您的按钮上,特别是要删除Image元素中的Source属性。


谢谢。我尝试了您的解决方案,它有效!但是我有不止一个按钮。我需要更通用的解决方案。也许我应该用ViewBox替换Image?在一个示例中,我看到可以使用绑定颜色和源来填充路径。 - Pavel Etrich
我猜你想要很多具有相同模板的按钮(一个标签和一个图像,带有相同的样式、布局和边距等),并且你只想从一个按钮变为另一个按钮时更改标签文本和图像源(以及绑定到按钮的命令)。如果你不想每次重复模板的xaml,我建议你创建一个具有按钮代码的UserControl,并使用一些DependencyProperty(如“TextProperty”和“ImageSourceProperty”或其他属性),将其与UC内部组件的属性绑定。 - Massimiliano Kraus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接