From 7a56e0dd5ef61591b91e41ce9c7556b92361d21f Mon Sep 17 00:00:00 2001 From: TheXamlGuy Date: Mon, 24 Jun 2024 20:07:27 +0100 Subject: [PATCH] Disable selection animation for now --- Toolkit.Avalonia/ContentTemplate.cs | 13 +++ Toolkit.Foundation/ObservableCollection.cs | 86 +++++++++++-------- Toolkit.Foundation/SelectionEventArgs.cs | 2 +- .../InvokeNavigationViewItemAction.cs | 12 +-- .../Toolkit.UI.Controls.Avalonia.csproj | 2 +- 5 files changed, 71 insertions(+), 44 deletions(-) diff --git a/Toolkit.Avalonia/ContentTemplate.cs b/Toolkit.Avalonia/ContentTemplate.cs index 5c520c1..2c1d692 100644 --- a/Toolkit.Avalonia/ContentTemplate.cs +++ b/Toolkit.Avalonia/ContentTemplate.cs @@ -34,6 +34,17 @@ public class ContentTemplate : } } + async void HandleDataContextChanged(object? sender, EventArgs args) + { + if (control.DataContext is object content) + { + if (content is IActivated activated) + { + await activated.Activated(); + } + } + } + async void HandleUnloaded(object? sender, RoutedEventArgs args) { control.Unloaded -= HandleUnloaded; @@ -48,6 +59,8 @@ public class ContentTemplate : control.Loaded += HandleLoaded; control.Unloaded += HandleUnloaded; + control.DataContextChanged += HandleDataContextChanged; ; + return control; } } diff --git a/Toolkit.Foundation/ObservableCollection.cs b/Toolkit.Foundation/ObservableCollection.cs index f7e027c..06f96ff 100644 --- a/Toolkit.Foundation/ObservableCollection.cs +++ b/Toolkit.Foundation/ObservableCollection.cs @@ -144,8 +144,20 @@ public partial class ObservableCollection : } } + public virtual Task Activated() + { + IsActivated = true; + while (pendingEvents.Count > 0) + { + object current = pendingEvents.Dequeue(); + Handle((dynamic)current); + } + + return Task.CompletedTask; + } + public TItem Add(params object?[] parameters) - where T : + where T : TItem { T? item = Factory.Create(args => @@ -240,6 +252,15 @@ public partial class ObservableCollection : void ICollection.CopyTo(Array array, int index) => collection.CopyTo((TItem[])array, index); + public virtual Task Deactivated() + { + IsActivated = false; + return Task.CompletedTask; + } + + public virtual Task Deactivating() => + Task.CompletedTask; + public virtual void Dispose() { GC.SuppressFinalize(this); @@ -395,6 +416,21 @@ public partial class ObservableCollection : IsCompatibleObject(value) ? IndexOf((TItem)value!) : -1; + public virtual Task Initialize() + { + if (IsInitialized) + { + return Task.CompletedTask; + } + + IsInitialized = true; + + Subscriber.Subscribe(this); + Synchronize(); + + return Task.CompletedTask; + } + public TItem Insert(int index = 0, params object?[] parameters) where T : @@ -479,41 +515,6 @@ public partial class ObservableCollection : return true; } - public virtual Task Activated() - { - IsActivated = true; - while (pendingEvents.Count > 0) - { - object current = pendingEvents.Dequeue(); - Handle((dynamic)current); - } - - return Task.CompletedTask; - } - - public virtual Task Deactivated() - { - IsActivated = false; - return Task.CompletedTask; - } - - public virtual Task Deactivating() => - Task.CompletedTask; - - public virtual Task Initialize() - { - if (IsInitialized) - { - return Task.CompletedTask; - } - - IsInitialized = true; - - Subscriber.Subscribe(this); - Synchronize(); - - return Task.CompletedTask; - } public bool Remove(TItem item) { int index = collection.IndexOf(item); @@ -582,6 +583,7 @@ public partial class ObservableCollection : SynchronizeExpression expression = BuildAggregateExpression(); Publisher.PublishUI(expression.Value, expression.Key); } + public void Track(string propertyName, Func getter, Action setter) { if (!trackedProperties.ContainsKey(propertyName)) @@ -616,6 +618,7 @@ public partial class ObservableCollection : collection.Insert(index > Count ? Count : index, item); } + protected virtual void RemoveItem(int index) => collection.RemoveAt(index); @@ -631,6 +634,17 @@ public partial class ObservableCollection : CollectionChanged?.Invoke(this, args); } + partial void OnIsActivatedChanged(bool value) + { + if (value) + { + while (pendingEvents.Count > 0) + { + object current = pendingEvents.Dequeue(); + Handle((dynamic)current); + } + } + } partial void OnSelectedItemChanged(TItem? oldValue, TItem? newValue) { if (oldValue is ISelectable oldSelection) diff --git a/Toolkit.Foundation/SelectionEventArgs.cs b/Toolkit.Foundation/SelectionEventArgs.cs index bb121bb..48def9c 100644 --- a/Toolkit.Foundation/SelectionEventArgs.cs +++ b/Toolkit.Foundation/SelectionEventArgs.cs @@ -1,3 +1,3 @@ namespace Toolkit.Foundation; -public record SelectionEventArgs(TValue? Value); \ No newline at end of file +public record SelectionEventArgs(TSender? Sender); \ No newline at end of file diff --git a/Toolkit.UI.Avalonia/InvokeNavigationViewItemAction.cs b/Toolkit.UI.Avalonia/InvokeNavigationViewItemAction.cs index 7f86405..7701f65 100644 --- a/Toolkit.UI.Avalonia/InvokeNavigationViewItemAction.cs +++ b/Toolkit.UI.Avalonia/InvokeNavigationViewItemAction.cs @@ -2,7 +2,6 @@ using Avalonia.Threading; using Avalonia.Xaml.Interactivity; using System.Collections; -using Toolkit.Foundation; using Toolkit.UI.Controls.Avalonia; namespace Toolkit.UI.Avalonia; @@ -19,9 +18,9 @@ public class InvokeNavigationViewItemAction : { if (navigationViewItem.MenuItemsSource is IList collection) { - if (collection is { Count: > 0 } && collection[0] is ISelectable selectable) + if (collection is { Count: > 0 }) { - selectable.IsSelected = true; + navigationViewItem.SetValue(NavigationView.SelectedItemProperty, collection[0]); } } }, DispatcherPriority.ContextIdle); @@ -29,13 +28,13 @@ public class InvokeNavigationViewItemAction : if (sender is NavigationView navigationView) { - Dispatcher.UIThread.Post(() => + Dispatcher.UIThread.Invoke(() => { if (navigationView.MenuItemsSource is IList collection) { - if (collection is { Count: > 0 } && collection[0] is ISelectable selectable) + if (collection is { Count: > 0 }) { - selectable.IsSelected = true; + navigationView.SetValue(NavigationView.SelectedItemProperty, collection[0]); } } }, DispatcherPriority.ContextIdle); @@ -43,4 +42,5 @@ public class InvokeNavigationViewItemAction : return true; } + } \ No newline at end of file diff --git a/Toolkit.UI.Controls.Avalonia/Toolkit.UI.Controls.Avalonia.csproj b/Toolkit.UI.Controls.Avalonia/Toolkit.UI.Controls.Avalonia.csproj index 31d2784..405709c 100644 --- a/Toolkit.UI.Controls.Avalonia/Toolkit.UI.Controls.Avalonia.csproj +++ b/Toolkit.UI.Controls.Avalonia/Toolkit.UI.Controls.Avalonia.csproj @@ -14,6 +14,6 @@ - + \ No newline at end of file