Frage

Ich habe eine WPF-View mit einem itemsControl, das eine Beobachtung aus dem ViewModel bindet. Jetzt möchte ich langsame Gegenstände ausblenden, die ich aus der Beobachtung entferne.

ViewModel:

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

Aussicht:

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

Das Problem, das ich jetzt habe, ist jetzt, dass das Storyboard mit dem Entfernen eines Elements aus der Sammlung beginnt, aber gleichzeitig entfernen die ItemsControl den Gegenstand, und dafür ist die Animation nicht in Sichtweite ...

Gibt es eine Idee, wie Sie verhindern, dass das Element vor der Beendigung der Animation entfernen kann?

War es hilfreich?

Lösung

Dies ist viel schwieriger als es sein sollte. Das Problem mit einer "Entfernen" -Animation ist, dass nach dem Entfernen eines Elements aus der Datenblocksammlung die entsprechenden Visuals automatisch aus dem Elementbaum entfernt werden. Dies bedeutet, dass nichts mehr zu lenken bleibt.

Um es zu umgehen, müssen Sie einen Weg finden, um die Animation zu stapfen, bevor Sie das Element aus der Datenbanksammlung entfernen und nach Abschluss der Animation das ViewModel benachrichtigen, dass es in Ordnung ist, das Element zu entfernen.

Die andere Lösung besteht darin, das Verhalten der ItemsControl zu ändern, um die Lebensdauer des Container -Visuals besser zu steuern.

In jedem Fall ist es leider keine triviale Aufgabe, erledigt zu werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top