在Button的ContentTemplate中设置和动画填充矩形

时间:2013-01-10 08:35:58

标签: silverlight windows-phone-7 xaml button windows-phone

我使用WP7项目。 我设置了定义了许多ContentTemplates的按钮。 那些ContentTeplates包括Shapes(为简单起见,我们使用Rectangle):

<Button x:Name="button1" 
        Style="{StaticResource ButtonStyle1}" 
        ContentTemplate="{StaticResource DataTemplate1}">
</Button>

<Button x:Name="button2" 
        Style="{StaticResource ButtonStyle1}" 
        ContentTemplate="{StaticResource DataTemplate2}">
</Button>
...

<DataTemplate x:Key="DataTemplate1">
    <Rectangle Height="100" Width="100" Fill="{QUESTION_HERE}"/>
</DataTemplate>

我希望Rectangle的Fill属性为

  1. 等于托管按钮的前景色
  2. 在按下或禁用按钮时相应更改
  3. 我怎样才能做到这一点?


    我不太好的解决方案

    在WinRT中,我使用了相当好的RelativeSource方法:

    Fill="{Binding Foreground, RelativeSource={RelativeSource TemplatedParent}}" 
    

    不幸的是,WP无法正常工作。原因是WP的ContentPresenter在WinRT上没有ForegroundProperty。

    所以我试图在ContentPresenter上定义我自己的附加DP并在Button模板中使用它:

    Button.Template&gt;&gt; ContentControl.Template&gt;&gt;

    <ContentPresenter 
        local:FrameworkElementExtensions.Foreground="{TemplateBinding Foreground}"
    

    您知道我何时定义ContentPresenter RelativeSource绑定的DP开始工作。

    但不好的一面是当按下Button时,Rectangle的Fill会以几毫秒的延迟更新。 看起来不太好,我寻求更好的解决方案

1 个答案:

答案 0 :(得分:0)

这适用于SL5或WPF

如果您转到Button而不是ContentPresenter,相对来源方法就可以。

Fill="{Binding Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType=Button}}"

如果您需要使用相同的模板来处理其他类型的按钮,也可以定义AncestorType=ButtonBase,例如RepeatButtonToggleButton等。

编辑:

这是对SL3 / 4或WP7的攻击

TextBlock放入DataTemplate并绑定到其前景。

<DataTemplate>
    <Grid>
        <TextBlock x:Name="ForegroundProvider" Width="0" Height="0" Opacity="0"/>
        <Path Fill="{Binding Foreground, ElementName=ForegroundProvider}" ..../>
    </Grid>
</DataTemplate>

这很难看,但那是WP7 ...... :(