feat: change animation creation to loaded, thus it works in popup.

This commit is contained in:
Dong Bin
2025-02-25 01:31:59 +08:00
parent 3b129b1128
commit 27146acc49

View File

@@ -19,29 +19,30 @@ public class SelectionList: SelectingItemsControl
public const string PART_Indicator = "PART_Indicator";
private static readonly FuncTemplate<Panel?> DefaultPanel = new(() => new StackPanel());
private ImplicitAnimationCollection? _implicitAnimations;
private ContentPresenter? _indicator;
public static readonly StyledProperty<Control?> IndicatorProperty = AvaloniaProperty.Register<SelectionList, Control?>(
public static readonly StyledProperty<Control?> IndicatorProperty =
AvaloniaProperty.Register<SelectionList, Control?>(
nameof(Indicator));
public Control? Indicator
{
get => GetValue(IndicatorProperty);
set => SetValue(IndicatorProperty, value);
}
private ImplicitAnimationCollection? _implicitAnimations;
private ContentPresenter? _indicator;
static SelectionList()
{
SelectionModeProperty.OverrideMetadata<SelectionList>(
new StyledPropertyMetadata<SelectionMode>(
defaultValue: SelectionMode.Single,
SelectionMode.Single,
coerce: (_, _) => SelectionMode.Single)
);
SelectedItemProperty.Changed.AddClassHandler<SelectionList, object?>((list, args) =>
list.OnSelectedItemChanged(args));
}
public Control? Indicator
{
get => GetValue(IndicatorProperty);
set => SetValue(IndicatorProperty, value);
}
private void OnSelectedItemChanged(AvaloniaPropertyChangedEventArgs<object?> args)
{
var newValue = args.NewValue.Value;
@@ -50,12 +51,14 @@ public class SelectionList: SelectingItemsControl
OpacityProperty.SetValue(0d, _indicator);
return;
}
var container = ContainerFromItem(newValue);
if (container is null)
{
OpacityProperty.SetValue(0d, _indicator);
return;
}
OpacityProperty.SetValue(1d, _indicator);
InvalidateMeasure();
// InvalidateArrange();
@@ -69,10 +72,7 @@ public class SelectionList: SelectingItemsControl
var container = ContainerFromItem(SelectedItem);
if (container is null) return size;
var bounds = container.Bounds;
if (ItemsPanelRoot?.Bounds.Position is { } p)
{
bounds = bounds.Translate(p);
}
if (ItemsPanelRoot?.Bounds.Position is { } p) bounds = bounds.Translate(p);
_indicator.Arrange(bounds);
}
else
@@ -80,6 +80,7 @@ public class SelectionList: SelectingItemsControl
// This is a hack. The indicator is not visible, so we arrange it to a 1x1 rectangle
_indicator?.Arrange(new Rect(new Point(), new Size(1, 1)));
}
return size;
}
@@ -97,22 +98,19 @@ public class SelectionList: SelectingItemsControl
{
base.OnApplyTemplate(e);
_indicator = e.NameScope.Find<ContentPresenter>(PART_Indicator);
EnsureIndicatorAnimation();
}
protected override void OnLoaded(RoutedEventArgs e)
{
base.OnLoaded(e);
EnsureIndicatorAnimation();
if (_indicator is not null && SelectedItem is not null)
{
var container = ContainerFromItem(SelectedItem);
if (container is null) return;
_indicator.Opacity = 1;
var bounds = container.Bounds;
if (ItemsPanelRoot?.Bounds.Position is { } p)
{
bounds = bounds.Translate(p);
}
if (ItemsPanelRoot?.Bounds.Position is { } p) bounds = bounds.Translate(p);
_indicator.Arrange(bounds);
}
}
@@ -123,10 +121,7 @@ public class SelectionList: SelectingItemsControl
{
_indicator.Opacity = 0;
SetUpAnimation();
if (ElementComposition.GetElementVisual(_indicator) is { } v)
{
v.ImplicitAnimations = _implicitAnimations;
}
if (ElementComposition.GetElementVisual(_indicator) is { } v) v.ImplicitAnimations = _implicitAnimations;
}
}
@@ -167,9 +162,7 @@ public class SelectionList: SelectingItemsControl
var hotkeys = Application.Current!.PlatformSettings?.HotkeyConfiguration;
if (e.Key.ToNavigationDirection() is { } direction && direction.IsDirectional())
{
e.Handled |= MoveSelection(direction, WrapSelection);
}
base.OnKeyDown(e);
}
}