通过以下定义,当{INTOifyPropertyChanged兼容视图模型中的OnSignalChanged
更改其值时,Signal
永远不会被执行,当然,动画不会播放。我误解了一些基本的东西吗? TestCommand
只是将Signal
从false设置为true。
Public Class StoryboardSignalManager Public Shared SignalProperty As DependencyProperty = DependencyProperty.RegisterAttached("Signal", GetType(Boolean), GetType(StoryboardSignalManager), New PropertyMetadata(AddressOf OnSignalChanged)) Public Shared Function GetSignal(d As DependencyObject) As Boolean? Return DirectCast(d.GetValue(SignalProperty), Boolean?) End Function Public Shared Sub SetSignal(d As DependencyObject, value As Object) d.SetValue(SignalProperty, value) End Sub Private Shared Sub OnSignalChanged(d As DependencyObject, e As DependencyPropertyChangedEventArgs) Dim value As Boolean = DirectCast(e.NewValue, Boolean) Dim storyboard As Storyboard = DirectCast(d, Storyboard) If value Then storyboard.Begin() Else storyboard.Stop() End If End Sub End Class
<Grid>
<Grid.Resources>
<Storyboard x:Key="Fade" local:StoryboardSignalManager.Signal="{Binding Signal}">
<DoubleAnimationUsingKeyFrames Storyboard.Target="{Binding ElementName=TextBlock}" Storyboard.TargetProperty="Opacity">
<EasingDoubleKeyFrame KeyTime="00:00:00.00" Value="1" />
<EasingDoubleKeyFrame KeyTime="00:00:01.00" Value="0" />
<EasingDoubleKeyFrame KeyTime="00:00:02.00" Value="1" />
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</Grid.Resources>
<StackPanel>
<TextBlock x:Name="TextBlock" Text="test" />
<Button Width="100" Height="50" Command="{Binding TestCommand}" />
</StackPanel>
</Grid>
答案 0 :(得分:1)
我测试了你的代码(虽然在C#中),并且根据经验看起来你的PropertyChangedCallback似乎没有被调用,因为故事板是一种资源,它似乎没有在适当的时候被加载财产附加所以说......
要查看我正在谈论的内容,您可以为后面的usercontrol / view代码添加一个Loaded事件处理程序
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
var board = (this.FindResource("Fade") as Storyboard);
}
如果我没有弄错的话,这将回答你关于回调未被执行的问题;在控制加载时,您将使用FindResource强制加载资源,这将使附加属性正常工作。
然而,使这项工作似乎导致回调函数中storyboard.Begin()周围的堆栈溢出异常。我不知道为什么会这样(也许是一些隐藏的WPF魔法......有人告诉我,如果你知道为什么请!)
鉴于此,我建议您将动画改为:
<Grid local:StoryBoardSignalManager.Signal="{Binding Signal, Mode=TwoWay}" >
<Grid.Resources>
<Style x:Key="FadeAnimationStyle" TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=(local:StoryBoardSignalManager.Signal), RelativeSource={RelativeSource AncestorType=Grid}}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity">
<EasingDoubleKeyFrame KeyTime="00:00:00.00" Value="1" />
<EasingDoubleKeyFrame KeyTime="00:00:01.00" Value="0" />
<EasingDoubleKeyFrame KeyTime="00:00:02.00" Value="1" />
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Resources>
<StackPanel>
<TextBlock x:Name="TextBlock" Text="test" Style="{StaticResource FadeAnimationStyle}"/>
<Button Width="100" Height="50" Command="{Binding TestCommand}" />
</StackPanel>
</Grid>