无法使用画笔资源为Expression Blend中的对象边框设置动画

时间:2012-01-06 14:07:49

标签: c# wpf xaml expression-blend expression-blend-4

我正在尝试使用Expression blend为对象的边框颜色设置动画。

每当我将Storyboard中的边框值更改为我之前创建的画笔资源的值时,对象的基本边框会更改而不是动画。如果我将属性的值更改为基值的值(即:我不使用画笔资源),则动画按预期工作。

我们不能使用画笔资源为颜色属性设置动画吗?

以下是Expression Blend在为边框使用硬编码颜色值时生成的代码(此代码有效,动画播放正常,但边框的值是硬编码的):

<Style x:Key="StandardTextBoxStyle" BasedOn="{x:Null}" TargetType="{x:Type TextBox}">
    (...)
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TextBox}">
                <Grid x:Name="grid">
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                        (...)
                        </VisualStateGroup>
                        <VisualStateGroup x:Name="FocusStates">
                            <VisualStateGroup.Transitions>
                                <VisualTransition GeneratedDuration="0" To="Focused">
                                    <Storyboard>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Stroke).(SolidColorBrush.Color)" Storyboard.TargetName="rectangle">
                                            <EasingColorKeyFrame KeyTime="0" Value="#FFC2C2C2"/>
                                            <EasingColorKeyFrame KeyTime="0:0:0.2" Value="#FF5FA5C9"/>
                                        </ColorAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualTransition>
                            </VisualStateGroup.Transitions>
                            <VisualState x:Name="Unfocused"/>
                            <VisualState x:Name="Focused"/>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    (...)
</Style>

如何将硬编码值#FF5FA5C9替换为本地画笔资源的值?我应该用DynamicResource / StaticResource语句替换Value =“#FF5FA5C9”语句吗?

2 个答案:

答案 0 :(得分:2)

我可能会建议,不要试图为画笔资源设置动画,只需另外复制一个矩形形状并将其命名为Rectangle_Focused,并将其按顺序放在现有的矩形上,使其显示在原始矩形上。

将边框画笔资源添加到此形状,然后将形状可见性设置为折叠。然后在您的聚焦状态,鼠标悬停状态或任何您喜欢的状态下,将其可见性更改为可见。有点像;

<VisualState x:Name="Focused">
                                    <Storyboard>
                                        <DoubleAnimation Duration="0:0:0.1" To="1" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="FocusVisualElement" d:IsOptimized="True"/>
                                        <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="MouseOverBorder" d:IsOptimized="True"/>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="Background_Copy">
                                            <DiscreteObjectKeyFrame KeyTime="0">
                                                <DiscreteObjectKeyFrame.Value>
                                                    <Visibility>Visible</Visibility>
                                                </DiscreteObjectKeyFrame.Value>
                                            </DiscreteObjectKeyFrame>
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>

不要问我为什么,但动画到同一个对象中的画笔资源只是不会削减它,但你可以达到你想要的相同效果,不过这样。

答案 1 :(得分:1)

我相信我找到了问题。

出于某些原因,将笔划值指定为本地笔刷资源的值不会在动画的故事板中创建关键帧:

这是你不应该做的事情:

http://i.imgur.com/5X7Xm.jpg

相反,您必须创建一个 Color 本地资源,并将其指定为:

http://i.imgur.com/UGIOl.jpg

故事板中的关键帧将正确创建,动画将起作用。

Expression Blend中的错误可能吗?这是否正常工作?不知道:))