如何重置我的 WPF 动画

How do I reset my WPF Animation

所以我创建了一个 UserControl,并为它创建了一个依赖项 属性,这样我就可以将它用于我的动画。 动画有效,它启动了,但是当我单击一个新项目时它不会 滑动 返回它跳回到开始然后重新启动。

如何让动画滑回。 这是由于 OnSelectionChanged 中的 true 和 false 语句。

<Grid.Resources>
            <system:Double x:Key="SlideOffSet">50</system:Double>
            <Storyboard x:Key="SlideRight">
                <DoubleAnimation Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)"
                                 From="0" To="{StaticResource SlideOffSet}"
                                 Duration="0:0:0.2" />
            </Storyboard>
            <Storyboard x:Key="SlideLeft">
                <DoubleAnimation Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)"
                                 From="{StaticResource SlideOffSet}" To="0"
                                 Duration="0:0:0.2" />
            </Storyboard>
        </Grid.Resources>

<local:CustomizedList x:Name="uc" Margin="5" Grid.Column="0" DataContext="{Binding}" />

 <StackPanel Grid.Column="2"
                    Width="50"
                    Height="50"
                    Background="Gray">

            <StackPanel.Style>
                <Style TargetType="StackPanel">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding ElementName=uc, Path=SelectedItem}" Value="True">
                            <DataTrigger.EnterActions>
                                <BeginStoryboard Storyboard="{StaticResource SlideRight}" />
                            </DataTrigger.EnterActions>
                            <DataTrigger.ExitActions>
                                <BeginStoryboard Storyboard="{StaticResource SlideLeft}" />
                            </DataTrigger.ExitActions>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </StackPanel.Style>

            <StackPanel.RenderTransform>
                <TranslateTransform />
            </StackPanel.RenderTransform>

        </StackPanel>

用户控件

<ListBox ItemsSource="{Binding}" x:Name="list" HorizontalContentAlignment="Stretch" SelectionChanged="List_OnSelectionChanged">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Border Margin="2" BorderThickness="2" CornerRadius="3" BorderBrush="Brown">
                        <TextBlock Text="{Binding}" Margin="1">
                            <TextBlock.Background>
                                <LinearGradientBrush>
                                    <GradientStop Offset="0" Color="AliceBlue"/>
                                    <GradientStop Offset="1" Color="Blue"/>
                                </LinearGradientBrush>
                            </TextBlock.Background>
                        </TextBlock>
                    </Border>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

以及依赖项的 SelectionChanged 事件 属性

public static readonly DependencyProperty SelectedItemProperty =
            DependencyProperty.Register("SelectedItem", typeof(bool), typeof(CustomizedList));

        public bool SelectedItem
        {
            get { return (bool)GetValue(SelectedItemProperty); }
            set { SetValue(SelectedItemProperty, value); }
        }

        private void List_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            SelectedItem = false;
            SelectedItem = true;
        }

When the item is selected I want it to be true and when another item is selected, make it slide back and slide out again

那么,在将 属性 设置回 true 之前,您需要异步等待动画发生。试试这个:

private async void List_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    SelectedItem = false;
    await Task.Delay(1000); //wait for a second
    SelectedItem = true;
}