Как анимировать добавление и удаление в ListView/Box?
Я пытаюсь понять, как анимация работает в WPF со StoryBoards.
До сих пор мне удалось следующее:
- создание ListView с привязкой пользовательских элементов и ресурсов;
- с помощью
ItemContainerStyle
чтобы убедиться, что каждый элемент занимает всю ширину ListView; - с помощью
EventTrigger
вызвать определенную анимацию
Моя проблема проста.
Сначала я попробовал Loaded
триггер для анимации элемента всякий раз, когда он добавляется в привязанный ListView ObservableCollection
, Работает нормально с opacity
свойство, но проблема в том, что это событие вызывается при каждой прокрутке, что означает, что Windows загружает и выгружает элементы на ходу, чтобы сэкономить память (которая нестабильна, но использует гораздо больше ЦП со сложным элементом).
Так что это не пойдет. Кроме того, Unloaded
триггер "не очень работает" и был решен здесь: /questions/6414933/kak-ya-mogu-realizovat-postepennoe-ischeznovenie-i-dobavlenie-udalenie-listitems/6414944#6414944
Итак, используя вышеупомянутое решение, я бы хотел запустить анимацию вручную.
Чтобы быть более точным, всякий раз, когда конкретное свойство моих предметов (так же, как Removing
), я бы хотел StoryBoard
быть начатым
Как сделать это для скользящей анимации? Потому что мне бы очень хотелось, чтобы мои элементы скользили по оси X внутрь и наружу (вход слева и выход слева) моего ListView.
Эти скользящие анимации должны запускаться только тогда, когда элемент добавляется в связанный ObservableCollection
и когда это будет удалено.
Следующий код XAML не работает:
Внутри ListView > ListView.ItemTemplate > DataTemplate > DataTemplate.Triggers
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=Removing}" Value="true" >
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard >
<DoubleAnimation Storyboard.TargetProperty="Opacity" From="1" To="0" Duration="0:0:0.5"/>
<DoubleAnimation Storyboard.TargetProperty="LayoutTransform.ScaleY" From="0" Duration="0:0:.2"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
</DataTemplate.Triggers>
Анимация непрозрачности действительно работает просто отлично. Тем не менее LayoutTransform
создает следующее исключение System.InvalidOperationException: Cannot resolve all property references in the property path 'LayoutTransform.ScaleY'. Verify that applicable objects support the properties.
Более того, я просто не знаю, как сделать скользящую анимацию по оси X: /
Вот содержание моего ListViewItemContainerStyle
:
<Setter Property="HorizontalAlignment" Value="Stretch"></Setter>
<Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
<Setter Property="Margin" Value="0, -2, 0, -2" ></Setter>
<Setter Property="LayoutTransform">
<Setter.Value>
<ScaleTransform x:Name="transform" />
</Setter.Value>
</Setter>
<Setter Property="RenderTransform">
<Setter.Value>
<ScaleTransform/>
</Setter.Value>
</Setter>
Спасибо за помощь