我使用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属性为
我怎样才能做到这一点?
在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会以几毫秒的延迟更新。 看起来不太好,我寻求更好的解决方案。
答案 0 :(得分:0)
这适用于SL5或WPF
如果您转到Button
而不是ContentPresenter
,相对来源方法就可以。
Fill="{Binding Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType=Button}}"
如果您需要使用相同的模板来处理其他类型的按钮,也可以定义AncestorType=ButtonBase
,例如RepeatButton
,ToggleButton
等。
这是对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 ...... :(