StackPanel上的FluidMoveBehavior在动画之前会闪烁
本文关键字:闪烁 动画 上的 FluidMoveBehavior StackPanel | 更新日期: 2023-09-27 18:10:51
我有一个ItemsControl
, FluidMoveBehavior
附着在它上面,像这样:
<ScrollViewer VerticalScrollBarVisibility="Auto">
<ItemsControl ItemsSource="{Binding RequirementsSource}" ItemTemplateSelector="{StaticResource RequirementTemplateSelector}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel IsItemsHost="True">
<i:Interaction.Behaviors>
<ic:FluidMoveBehavior AppliesTo="Children" Duration="0:0:00.5" Tag="DataContext">
<ic:FluidMoveBehavior.EaseX>
<BackEase EasingMode="EaseInOut" Amplitude="0.5"/>
</ic:FluidMoveBehavior.EaseX>
<ic:FluidMoveBehavior.EaseY>
<BackEase EasingMode="EaseInOut" Amplitude="0.5"/>
</ic:FluidMoveBehavior.EaseY>
</ic:FluidMoveBehavior>
</i:Interaction.Behaviors>
</StackPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</ScrollViewer>
当项目改变他们的排序顺序,他们做动画,但首先项目排序,如果没有附加FluidMoveBehavior
,然后排序回来。整个过程发生得非常快,以至于在动画开始之前看起来就像闪烁一样。
ItemsControl
ItemsSource看起来像这样:
RequirementsSource = new ListCollectionView(Requirements);
ICollectionViewLiveShaping live = (ICollectionViewLiveShaping)RequirementsSource;
live.IsLiveSorting = True;
live.IsLiveFiltering = True;
live.LiveSortingProperties.Add("Rank");
live.LiveFilteringProperties.Add("Owner");
RequirementsSource.SortDescriptions.Add(
new SortDescription("Rank", ListSortDirection.Ascending)
);
RequirementsSource.Filter = _filterPred;
排序由以下方法触发:
private void SwapRanks(SwapArgs args)
{
IPropertyRequirement first = args.Warning.Requirements
.First(r => r.Rank == args.RankToSwap);
IPropertyRequirement second = args.Warning.Requirements
.First(r => r.Rank == args.SwapWith);
int temp = first.Rank;
first.Rank = second.Rank;
second.Rank = temp;
RequirementsSource.Refresh();
}
有没有人知道是什么原因导致这个"闪烁",我能做些什么来阻止它?
从代码中删除RequirementsSource.Refresh();
行。
因为你使用的是实时排序,动画在需求时开始。等级改变(触发PropertyChanged事件)。但是当你调用refresh时,它会引发带有Reset参数的CollectionChanged,并强制列表框刷新。
编辑:public class MainWindowViewModel
{
ObservableCollection<Requirement> requirements;
public MainWindowViewModel()
{
requirements = new ObservableCollection<Requirement>(Enumerable
.Range(0, 10)
.Select(i => new Requirement {Rank = 10 - i, Name = "Item " + i}));
RequirementsSource = new ListCollectionView(requirements);
var live = (ICollectionViewLiveShaping)RequirementsSource;
live.IsLiveSorting = true;
live.IsLiveFiltering = true;
live.LiveSortingProperties.Add("Rank");
RequirementsSource.SortDescriptions.Add(
new SortDescription("Rank", ListSortDirection.Ascending)
);
ReorderCommand = new DelegateCommand(Reorder);
}
public ListCollectionView RequirementsSource { get; set; }
public DelegateCommand ReorderCommand { get; private set; }
private void Reorder()
{
for (int i = 0; i < requirements.Count - 1; i += 2)
{
var temp = requirements[i].Rank;
requirements[i].Rank = requirements[i + 1].Rank;
requirements[i + 1].Rank = temp;
}
}
}
public class Requirement : BindableBase
{
private double _rank;
public double Rank
{
get { return _rank; }
set { SetProperty(ref _rank, value); }
}
public string Name { get; set; }
}