如何在“Pressed”VisualState中自定义ContentControl中的属性?

时间:2013-10-14 16:53:47

标签: c# wpf silverlight windows-phone-7 windows-phone-8

我正在构建Windows Phone应用程序,我创建了一个将被反复使用的自定义图标按钮。该按钮看起来非常像下图:

Button mockup

为了尝试遵循DRY(不要重复自己)原则,我创建了一个基本上继承自Button的类,并添加了一个名为 {{1}的ControlTemplate类型的自定义参数}

为了简洁,省略了关于IconTemplate的属性的部分

Text

创建课程后,我创建了一个名为public class IconButton : Button { public static readonly DependencyProperty IconTemplateProperty = DependencyProperty.Register( "IconTemplate", typeof(ControlTemplate), typeof(IconButton), null); public ControlTemplate IconTemplate { get { return (ControlTemplate)GetValue(IconTemplateProperty); } set { SetValue(IconTemplateProperty, value); } } } 的{​​{1}},它将一些样式应用于此课程。

Resource

所以我可以简单地创建这样的按钮,外观也是正确的。

Generic.xaml

问题是我想在用户点按按钮时更改<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:c="clr-namespace:PiadasEngracadas.Controls" <Style TargetType="c:IconButton"> <Setter Property="Background" Value="Transparent"/> <Setter Property="BorderBrush" Value="{StaticResource PhoneForegroundBrush}"/> <Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}"/> <Setter Property="BorderThickness" Value="{StaticResource PhoneBorderThickness}"/> <Setter Property="FontFamily" Value="{StaticResource PhoneFontFamilySemiBold}"/> <Setter Property="FontSize" Value="{StaticResource PhoneFontSizeMediumLarge}"/> <Setter Property="Padding" Value="0"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="c:IconButton"> <Grid Background="{TemplateBinding Background}" x:Name="ButtonBackground"> <VisualStateManager.VisualStateGroups> <VisualStateGroup x:Name="CommonStates"> <VisualState x:Name="Normal"/> <VisualState x:Name="MouseOver"/> <VisualState x:Name="Pressed"> <Storyboard> <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="IconTemplateContainer"> <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneBackgroundBrush}"/> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="ButtonBackground"> <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneForegroundBrush}"/> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> <VisualState x:Name="Disabled"> <Storyboard> <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="IconTemplateContainer"> <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneDisabledBrush}"/> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="ButtonBackground"> <DiscreteObjectKeyFrame KeyTime="0" Value="Transparent"/> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> </VisualStateGroup> </VisualStateManager.VisualStateGroups> <ContentControl x:Name="IconTemplateContainer" Template="{TemplateBinding IconTemplate}" /> <TextBlock VerticalAlignment="Bottom" HorizontalAlignment="Right" Margin="{StaticResource PhoneHorizontalMargin}" FontFamily="{StaticResource PhoneFontFamilyLight}" Text="{TemplateBinding Text}" /> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> </ResourceDictionary> 颜色。

由于我要一遍又一遍地使用这个按钮,我认为当点击按钮时,有另一个属性来定义新的笔触颜色可能是有价值的。类似的东西:

<c:IconButton Text="Some Text"
              IconTemplate="{StaticResource IconsButtons.Sleepy}" />

但问题是我不知道如何更改Path's Stroke <c:IconButton Text="Some Text" TappedColor="#123456" // New property IconTemplate="{StaticResource IconsButtons.Sleepy}" /> 的{​​{1}}(?)的颜色。我在考虑这样的事情:

Path

我知道这种语法是完全错误的,但我想知道是否有人可以帮助我实现目标。

PS:我将所有Template包装在ContentControl中,因为直接使用<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Stroke" Storyboard.TargetName="(IconTemplateContainer).(Template).(Stroke)"> 并将其绑定到Path属性ControlTemplate在WP上不起作用(或者至少我不够聪明,无法使其工作)。即使在这种情况下,我如何更改Path内容Content VisualState`中对象的属性?

更新

ContentControl代码如下

ContentControl

1 个答案:

答案 0 :(得分:2)

您可以对IconButton前景色的路径的笔触颜色执行TemplateBinding。然后你可以改变IconButton的前景颜色,它将改变路径颜色:Stroke =“{TemplateBinding Foreground}”