Как сбросить анимацию WPF - PullRequest
0 голосов
/ 24 августа 2018

Итак, я создал UserControl и создал для него свойство зависимостей, чтобы я мог использовать его для своей анимации. Анимация работает, она запускается, но когда я щелкаю по новому элементу, он не скользит , возвращается к началу и затем перезапускается.

Как мне сделать анимацию скользящей обратно. Это связано с истинными и ложными утверждениями в OnSelectionChanged.

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

UserControl

<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;
        }

1 Ответ

0 голосов
/ 24 августа 2018

Когда выбран элемент, я хочу, чтобы он был истинным, а когда выбран другой элемент, заставьте его сдвинуться назад и снова выдвинуться

Ну, тогда вам нужно асинхронно ждатьанимация должна появиться до того, как вы установите свойство обратно true.Попробуйте это:

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