在样式中,将路径的填充属性绑定到ContentControl中的前景属性

13

我遇到了一个Silverlight问题:我使用了两天的时间去解决:一个带有样式控件的模板来控制一个按钮。在具体的按钮中,我有一个包含路径的画布作为内容。问题是我想要将路径的填充颜色绑定到模板中的ContentControl的Foreground。

然而,我一直无法找到如何构建绑定以获取到Foreground的方法。例如,如果我使用TextBlock,它会自动从样式中获取Foreground颜色。这是预期的,因为文本具有Foreground颜色。绑定的原因是动画控制前景色,我希望它传播到路径的填充颜色。有任何想法吗?

模板包含以下内容:

<Style x:Key="PathButtonStyle" TargetType="Button">

... Animations and state stuff

  <Border x:Name="ButtonBackground" BorderBrush="{TemplateBinding BorderBrush}" >
    <ContentControl x:Name="ContentContainer" 
      ContentTemplate="{TemplateBinding ContentTemplate}" 
      Content="{TemplateBinding Content}" 
      Foreground="{TemplateBinding Foreground}" />
  </Border>
</Style>

在我的布局中,我有以下内容:

<Button x:Name="Play" Style="{StaticResource PathButtonStyle}" >
  <Canvas x:Name="PlayIcon">
    <Path Data="F1M191.4839,96.1763L177.9149,106.5173L177.9149,85.9293z" 
          Fill="{PATH TO CONTENTCONTROLS FOREGROUND}" />
  </Canvas>
</Button>
我已经清理了代码并删除了一些东西以使其更易读,但我希望你能理解其中的思路。
3个回答

9

由于您给按钮命名了一个名称,因此可以使用绑定的ElementName参数:

<Button x:Name="Play" Style="{StaticResource PathButtonStyle}" >
    <Canvas x:Name="PlayIcon">
        <Path Data="F1M191.4839,96.1763L177.9149,106.5173L177.9149,85.9293z" 
            Fill="{Binding Foreground, ElementName=Play}" />
    </Canvas>
</Button>

4
我不帮助前景动画。我继续寻找解决方案。 - Viacheslav Smityukh

1
实际上,你可以将Canvas放在Button的模板中,而不是将其设置为Button的内容。
      <Style x:Key="PathButtonStyle" TargetType="Button">

    ... Animations and state stuff
     <Canvas x:Name="PlayIcon">
    <Path Data="F1M191.4839,96.1763L177.9149,106.5173L177.9149,85.9293z" 
          Fill="{TemplateBinding Foreground}" />
  </Canvas>
      <Border x:Name="ButtonBackground" BorderBrush="{TemplateBinding BorderBrush}" >
        <ContentControl x:Name="ContentContainer" 
          ContentTemplate="{TemplateBinding ContentTemplate}" 
          Content="{TemplateBinding Content}" 
          Foreground="{TemplateBinding Foreground}" />
      </Border>
    </Style>

如果你使用这个方案,你可以做任何想做的事情。


5
这个回答没有意义,路径本身就是内容,如果只需要一个路径,那么为什么还要使用模板呢?关键在于能够将各种不同路径放入样式化按钮中。 - AnthonyWJones
我将Canvas移动到模板中,因为在那里我可以绑定到ContentContainer。据我所知,没有其他方法可以做到这一点。实际上,即使只需要一个路径,你也可以选择使用模板(因为你可能需要一些模板更改...)。尽管上面的答案是解决当前问题的方法。 - Sonosar

0

绑定到 ContentControl 应该会有所帮助(Silverlight 5):

<Button x:Name="Play" Style="{StaticResource PathButtonStyle}" >
    <Canvas x:Name="PlayIcon">
        <Path Data="F1M191.4839,96.1763L177.9149,106.5173L177.9149,85.9293z" 
              Fill="{Binding Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType=ContentControl}}" />
    </Canvas>
</Button>

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