我正在构建Windows Phone应用程序,我创建了一个将被反复使用的自定义图标按钮。该按钮看起来非常像下图:
为了尝试遵循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
答案 0 :(得分:2)
您可以对IconButton前景色的路径的笔触颜色执行TemplateBinding。然后你可以改变IconButton的前景颜色,它将改变路径颜色:Stroke =“{TemplateBinding Foreground}”