Skip to content

Commit f7ec2db

Browse files
committed
improved animations
1 parent c658e9a commit f7ec2db

File tree

3 files changed

+60
-229
lines changed

3 files changed

+60
-229
lines changed

src/Avalonia.Desktop/Controls/AnimatedWrapPanel.cs

Lines changed: 0 additions & 221 deletions
This file was deleted.

src/Avalonia.Desktop/Controls/CampaignsControl.axaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
xmlns:ctrl="clr-namespace:Avalonia.Desktop.Controls"
1010
xmlns:in="clr-namespace:Common.Interfaces;assembly=BuildLauncher.Common.Common"
1111
x:DataType="vm:CampaignsViewModel"
12+
AttachedToVisualTree="OnControlAttachedToVisualTree"
1213
x:Class="Avalonia.Desktop.Controls.CampaignsControl">
1314

1415
<UserControl.Resources>
@@ -84,7 +85,6 @@
8485
</DataTemplate>
8586
</UserControl.DataTemplates>
8687

87-
8888
<Grid RowDefinitions="auto,*,auto" ColumnDefinitions="2*,*">
8989

9090
<Grid ColumnDefinitions="auto,*,auto"
@@ -115,7 +115,7 @@
115115
ItemsSource="{Binding CampaignsList}"
116116
SelectedItem="{Binding SelectedAddon}"
117117
PointerPressed="OnCampaignsListEmptySpaceClicked"
118-
ContainerPrepared="ListBox_ContainerPrepared"
118+
ContainerPrepared="OnListBoxContainerPrepared"
119119
DragDrop.AllowDrop="True"
120120
DragDrop.Drop="OnCampaignsListDrop">
121121

@@ -173,7 +173,7 @@
173173

174174
<ListBox.ItemsPanel>
175175
<ItemsPanelTemplate>
176-
<ctrl:AnimatedWrapPanel Orientation="Horizontal" ItemSpacing="3" LineSpacing="0"/>
176+
<WrapPanel Orientation="Horizontal" ItemSpacing="3" LineSpacing="0"/>
177177
</ItemsPanelTemplate>
178178
</ListBox.ItemsPanel>
179179

src/Avalonia.Desktop/Controls/CampaignsControl.axaml.cs

Lines changed: 57 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,13 @@
44
using Avalonia.Desktop.Misc;
55
using Avalonia.Desktop.ViewModels;
66
using Avalonia.Input;
7+
using Avalonia.Rendering.Composition;
8+
using Avalonia.Rendering.Composition.Animations;
79
using Common.Common.Helpers;
810
using Common.Enums;
11+
using Common.Helpers;
912
using Common.Interfaces;
13+
using CommunityToolkit.Diagnostics;
1014
using CommunityToolkit.Mvvm.Input;
1115
using Ports.Ports;
1216
using Ports.Providers;
@@ -24,6 +28,8 @@ public sealed partial class CampaignsControl : UserControl
2428
private readonly InstalledAddonsProvider _addonsProvider;
2529
private readonly BitmapsCache _bitmapsCache;
2630

31+
private ImplicitAnimationCollection? _implicitAnimations;
32+
2733
public CampaignsControl()
2834
{
2935
InitializeComponent();
@@ -383,13 +389,59 @@ private async void OnCampaignsListDrop(object sender, DragEventArgs e)
383389
}
384390
}
385391

386-
private void ListBox_ContainerPrepared(object? sender, Avalonia.Controls.ContainerPreparedEventArgs e)
392+
private void OnListBoxContainerPrepared(object? sender, ContainerPreparedEventArgs e)
393+
{
394+
if (e.Container is ListBoxItem item)
395+
{
396+
if (item.Content is SeparatorItem)
397+
{
398+
item.IsHitTestVisible = false;
399+
item.Focusable = false;
400+
}
401+
else
402+
{
403+
if (_implicitAnimations != null)
404+
{
405+
EnsureImplicitAnimationsAsync(item);
406+
}
407+
}
408+
}
409+
}
410+
411+
private void OnControlAttachedToVisualTree(object? sender, VisualTreeAttachmentEventArgs e)
387412
{
388-
if (e.Container is ListBoxItem item &&
389-
item.Content is SeparatorItem)
413+
if (_implicitAnimations == null)
390414
{
391-
item.IsHitTestVisible = false;
392-
item.Focusable = false;
415+
var compositor = ElementComposition.GetElementVisual(this)?.Compositor;
416+
417+
Guard.IsNotNull(compositor);
418+
419+
var offsetAnimation = compositor.CreateVector3KeyFrameAnimation();
420+
offsetAnimation.Target = "Offset";
421+
offsetAnimation.InsertExpressionKeyFrame(1.0f, "this.FinalValue");
422+
offsetAnimation.Duration = TimeSpan.FromMilliseconds(400);
423+
424+
var animationGroup = compositor.CreateAnimationGroup();
425+
animationGroup.Add(offsetAnimation);
426+
427+
_implicitAnimations = compositor.CreateImplicitAnimationCollection();
428+
_implicitAnimations["Offset"] = animationGroup;
429+
}
430+
}
431+
432+
private async void EnsureImplicitAnimationsAsync(Control control)
433+
{
434+
for (int i = 0; i < 5; i++)
435+
{
436+
var visual = ElementComposition.GetElementVisual(control);
437+
438+
if (visual != null)
439+
{
440+
visual.ImplicitAnimations = _implicitAnimations;
441+
return;
442+
}
443+
444+
await Task.Delay(50).ConfigureAwait(true);
393445
}
394446
}
395447
}

0 commit comments

Comments
 (0)