回调没有在故事板上执行附加属性

时间:2015-11-03 22:13:24

标签: wpf xaml storyboard attached-properties

通过以下定义,当{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>

1 个答案:

答案 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>