【问题标题】:How to bind background color to property "To" of a ColorAnimation?如何将背景颜色绑定到 ColorAnimation 的属性“To”?
【发布时间】:2016-08-28 14:19:13
【问题描述】:

我有一个开关控件的彩色动画,并让背景颜色可以更改,我想将父控件的Background 属性绑定到ColorAnimationTo 属性。我尝试了很多,但没有人工作。我该怎么做?

开关控制方式:

<Setter Property="Template">
<Setter.Value>
    <ControlTemplate TargetType="CheckBox">
        <Viewbox Stretch="Uniform">
            <Border x:Name="layer" Width="35" Height="20" CornerRadius="10,10,10,10" 
                            Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
                <Canvas Canvas.Top="0" Canvas.Left="0">
                    <Ellipse x:Name="circle" Fill="Gray" Stroke="DarkGray" StrokeThickness="0" 
                                 Width="20" Height="20">
                        <Ellipse.RenderTransform>
                            <TranslateTransform X="0" Y="0"/>
                        </Ellipse.RenderTransform>
                    </Ellipse>
                </Canvas>
            </Border>
        </Viewbox>
        <ControlTemplate.Triggers>
            <Trigger Property="IsChecked" Value="True">
                <Trigger.EnterActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <ColorAnimation Storyboard.TargetName="layer" 
                                                    Storyboard.TargetProperty="Background.Color"
                                                    To="LightGreen"
                                                    Duration="0:0:0.3"/>
                            <DoubleAnimation Storyboard.TargetName="circle"
                                                     Storyboard.TargetProperty="(Ellipse.RenderTransform).(TranslateTransform.X)"
                                                     To="15"
                                                     Duration="0:0:0.3"/>
                        </Storyboard>
                    </BeginStoryboard>
                </Trigger.EnterActions>
                <Trigger.ExitActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <ColorAnimation Storyboard.TargetName="layer" 
                                                    Storyboard.TargetProperty="Background.Color"
                                                    Duration="0:0:0.3"
                                                        To="{TemplateBinding Background}"/>
                            <DoubleAnimation Storyboard.TargetName="circle"
                                                     Storyboard.TargetProperty="(Ellipse.RenderTransform).(TranslateTransform.X)"
                                                     To="0"
                                                     Duration="0:0:0.3"/>
                        </Storyboard>
                    </BeginStoryboard>
                </Trigger.ExitActions>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
</Setter.Value>
</Style>

ColorAnimation部分:

    <ColorAnimation Storyboard.TargetName="layer" 
                    Storyboard.TargetProperty="Background.Color"
                    To="{TemplateBinding Background}"
                    Duration="0:0:0.3"/>

【问题讨论】:

    标签: wpf binding coloranimation


    【解决方案1】:

    你不能在彩色动画中使用绑定,否则你会得到这个错误 “无法冻结此 Storyboard 时间线树以供跨线程使用”,更多信息请点击此处: WPF Animation "Cannot freeze this Storyboard timeline tree for use across threads".

    现在,如果您想解决问题,您可以做一个静态资源,它代表您的父控件的背景颜色,如下所示:

     <Color  A="255"
                R="100"
                G="0"
                B="0"
                x:Key="resource" />
    

    然后您可以将此资源分配给您的颜色动画属性,如下所示:

    <ColorAnimation Storyboard.TargetName="layer"
                                                            Storyboard.TargetProperty="Background.Color"
                                                            Duration="0:0:0.3"
                                                            To="{StaticResource ResourceKey=resource }" />
    

    希望对你有帮助。

    【讨论】:

    • 但我希望它可以在 MainWindow.xaml 中进行自定义。所以颜色不应该是恒定的,当控件的背景改变时,To 属性也应该改变。将颜色设置为恒定值作为资源无法更改。
    • 那么我猜你必须在后面的代码中执行此操作。
    • @AliTor 你可以使用动态资源,这是一个很好的例子:stackoverflow.com/questions/17502467/…
    • 您可以更改复选框选中事件上的动态资源的值,将其设置为控件的当前背景颜色。
    猜你喜欢
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 2022-08-06
    • 2016-08-23
    • 2020-05-22
    • 1970-01-01
    相关资源
    最近更新 更多