none
VisualState变化时的动画, 无法使用模板绑定作为目标值 RRS feed

  • 问题

  •                 <ControlTemplate TargetType="{x:Type local:LToggleButton}">
                        <Grid Name="root"
                              Width="{TemplateBinding Width}"
                              Height="{TemplateBinding Height}"
                              >
                            <VisualStateManager.VisualStateGroups>
                                <VisualStateGroup x:Name="CheckStates">
                                    <VisualState x:Name="Unchecked">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="content" Storyboard.TargetProperty="Fill">
                                                <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{TemplateBinding Background}"/>
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="Checked">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="content" Storyboard.TargetProperty="Fill">
                                                <DiscreteObjectKeyFrame KeyTime="0" Value="{TemplateBinding CheckedFillBrush}"/>
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                </VisualStateGroup>
                            </VisualStateManager.VisualStateGroups>
                            <Ellipse x:Name="content"
                                     />
                            <Ellipse x:Name="border"
                                     Fill="Transparent"
                                     Stroke="{TemplateBinding BorderBrush}"
                                     StrokeThickness="{TemplateBinding BorderThickness,Converter={StaticResource ThicknessConverter}}"
                                     />
                        </Grid>
                    </ControlTemplate>

    如上所示, 我定义了一个自定义控件(继承自Control), 上面是该自定义控件的模板. 其中,ThicknessConverter是我自定义的转换器(无关), CheckedFillBrush是我自定义的依赖性属性(Brush).

    如<grid><VisualStateManager.VisualStateGroups><VisualStateGroup><VisualState><Storyboard>中的动画所示: 我将关键帧动画的目标值设置为模板的属性Background, 实际运行时无任何效果(ellipse的填充色不会变化);

    为了测试问题出处, 我将该storyboard中的动画替换为:

    <DoubleAnimation To=".3" Storyboard.TargetName="border" Storyboard.TargetProperty="Opacity"></DoubleAnimation>

    上述动画有效果(ellipse的透明度变小).

    由此我得出结论, 动画的目标值/关键帧值无法设置为动态值, 这个问题我在之前似乎也遇到过.

    我的结论是否正确呢?

    如果是正确的, 我如何做出一个按钮, 能够设置两种状态下的填充画刷, 并能够通过状态转换来动态改变呢?

    希望各位不吝赐教, 不胜感激!

    • 已移动 Caillen 2014年12月17日 6:16
    2014年12月16日 9:55

答案

  • Animation的几乎所有属性都不能设置为动态值, 可能是为了保证动画的安全性和连贯性吧, 毕竟动画应该有独立的线程和运算逻辑.

    就此结贴吧.

    • 已标记为答案 Lymim 2015年2月5日 2:45
    2015年2月5日 2:45

全部回复

  • //---------------------------------

    一时心急, 投错区域了, 希望版主帮我移到WPF分区, 谢谢.

    2014年12月16日 9:58
  • 已经帮你移过来。

    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年12月17日 6:18
  • Animation的几乎所有属性都不能设置为动态值, 可能是为了保证动画的安全性和连贯性吧, 毕竟动画应该有独立的线程和运算逻辑.

    就此结贴吧.

    • 已标记为答案 Lymim 2015年2月5日 2:45
    2015年2月5日 2:45