【发布时间】:2017-06-06 19:33:29
【问题描述】:
我在这里找到了一个good explanation,关于如何将ColorAnimation 的Duration 属性绑定到Slider 的Value 属性。使用转换器将滑块中的Double 值转换为Duration,并使用Binding 设置ColorAnimation 的Duration。简而言之,这是它的工作原理:
<Window.Resources>
<local:DoubleToDurationConverter x:Key="DoubleToDurationConverter" />
</Window.Resources>
<Slider x:Name="slider" />
<Button Content="Click me for an animation">
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<ColorAnimation To="Green"
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
FillBehavior="Stop"
Duration="{Binding ElementName=slider,
Path=Value,
Mode=OneWay,
Converter={StaticResource DoubleToDurationConverter}}" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
我试过了,对我来说效果很好。但我想做的是将Duration 绑定到一个名为FadeTime 的依赖属性,我已添加到我的自定义控件中。所以,在那个控件的ControlTemplate 我有这个:
<ControlTemplate.Triggers>
<Trigger Property="IsLit" Value="true">
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="glow"
Storyboard.TargetProperty="Opacity"
To="1"
Duration="{Binding FadeTime, Mode=OneWay,
RelativeSource={RelativeSource TemplatedParent}}"/>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
</Trigger>
</ControlTemplate.Triggers>
这可以编译,但在运行时给我一条错误消息:
InvalidOperationException:无法冻结此 Storyboard 时间线树 跨线程使用。
如何将我的DoubleAnimation 的Duration 绑定到自定义控件的ControlTemplate 中的依赖变量?
谢谢!
更新
对于我想做的事情来说,数据绑定实际上是大材小用。真正的数据绑定将允许属性的值在运行时更改。我真正想要的是让使用我的自定义控件的开发人员能够在设计时设置DoubleAnimation 的Duration,而无需编辑ControlTemplate。如果开发者选择的值在运行时从不改变也没关系。
【问题讨论】:
标签: wpf xaml data-binding