Исчезновение удаления элемента из элементов управления - PullRequest
4 голосов
/ 24 июля 2011

У меня есть WPF-View с ItemsControl, который связывает ObservableCollection из ViewModel.Теперь я хочу постепенно исчезать элементы, которые я удаляю из коллекции ObservableCollection.

ViewModel:

public class ViewModel
{
    public ObservableCollection<string> Items { get; set; }
}

View:

<Window x:Class="Sandbox.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"
    Name="mainWindow">
<Window.Resources>
    <DataTemplate x:Key="mytemplate">
        <DataTemplate.Resources>
            <Storyboard x:Key="OnUnloaded">
                <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" Storyboard.TargetName="grid">
                    <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
                    <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="-0"/>
                </DoubleAnimationUsingKeyFrames>
                <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)" Storyboard.TargetName="grid">
                    <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
                    <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="-10"/>
                </DoubleAnimationUsingKeyFrames>
            </Storyboard>
        </DataTemplate.Resources>
        <Grid x:Name="grid" RenderTransformOrigin="0.5,0.5">
            <Grid.RenderTransform>
                <TransformGroup>
                    <ScaleTransform/>
                    <SkewTransform/>
                    <RotateTransform/>
                    <TranslateTransform/>
                </TransformGroup>
            </Grid.RenderTransform>
            <TextBox Text="{Binding Mode=OneWay}"/>
        </Grid>
        <DataTemplate.Triggers>
            <EventTrigger RoutedEvent="FrameworkElement.Unloaded">
                <BeginStoryboard Storyboard="{StaticResource OnUnloaded}"/>
            </EventTrigger>
        </DataTemplate.Triggers>
    </DataTemplate>
</Window.Resources>
<StackPanel>
    <ItemsControl Grid.Row="1" ItemsSource="{Binding Items}" ItemTemplate="{StaticResource mytemplate}"/>
</StackPanel>

* 1010Теперь у меня проблема в том, что раскадровка начинается с удаления элемента из коллекции, но в то же время управление элементами удаляет элемент, и для этого анимация не видна ...

любая идея, какпредотвратить удаление элемента до прекращения анимации?

1 Ответ

9 голосов
/ 24 июля 2011

Это намного сложнее, чем должно быть.Проблема с анимацией «удалить» состоит в том, что после удаления элемента из коллекции, связанной с данными, соответствующие визуальные элементы автоматически удаляются из дерева элементов.Это означает, что ничего не осталось для анимации.

Чтобы обойти это, вам нужно найти способ поставить анимацию в очередь, прежде чем удалить элемент из коллекции с привязкой к данным, и как только анимация будет завершена, уведомите об этомViewModel, что можно удалить элемент.

Другим решением является изменение поведения ItemsControl для лучшего контроля времени жизни визуалов контейнера.

В любом случае, к сожалению, это не так.тривиальная задача для выполнения.

...