From 95dd84d323741bd44b64f4f76652924f1f5d69d4 Mon Sep 17 00:00:00 2001 From: Dan Clark Date: Tue, 11 Feb 2025 14:56:16 +0000 Subject: [PATCH] Added ItemContainerInvokedBehavior --- Toolkit.Foundation/SerialContext.cs | 2 +- Toolkit.Foundation/SerialStructReader.cs | 18 ++-- .../ItemContainerInvokedBehavior.cs | 86 +++++++++++++++++++ Toolkit.UI.WinUI/ItemInvokedEventArgs.cs | 5 ++ 4 files changed, 99 insertions(+), 12 deletions(-) create mode 100644 Toolkit.UI.WinUI/ItemContainerInvokedBehavior.cs create mode 100644 Toolkit.UI.WinUI/ItemInvokedEventArgs.cs diff --git a/Toolkit.Foundation/SerialContext.cs b/Toolkit.Foundation/SerialContext.cs index 0e3de7e..a04ae06 100644 --- a/Toolkit.Foundation/SerialContext.cs +++ b/Toolkit.Foundation/SerialContext.cs @@ -31,7 +31,7 @@ public class SerialContext(IMessenger messenger, { await foreach (TValue value in reader.ReadAsync()) { - messenger.Send(new SerialEventArgs { Value = value }); + messenger.Send(new TEvent { Value = value }); } } } diff --git a/Toolkit.Foundation/SerialStructReader.cs b/Toolkit.Foundation/SerialStructReader.cs index ab5e786..9ee630b 100644 --- a/Toolkit.Foundation/SerialStructReader.cs +++ b/Toolkit.Foundation/SerialStructReader.cs @@ -12,8 +12,7 @@ public class SerialStructReader(Stream stream) : { while (true) { - ReadResult? result = default; - + ReadResult result; try { result = await reader.ReadAsync(); @@ -31,21 +30,18 @@ public class SerialStructReader(Stream stream) : yield break; } - if (result.HasValue) + ReadOnlySequence buffer = result.Buffer; + while (TryParse(ref buffer, out SerialStructEventArgs serialEvent)) { - ReadOnlySequence buffer = result.Value.Buffer; - while (TryParse(ref buffer, out SerialStructEventArgs serialEvent)) - { - yield return serialEvent; - } - - reader.AdvanceTo(buffer.Start, buffer.End); + yield return serialEvent; } + reader.AdvanceTo(buffer.Start, buffer.End); } } - private bool TryParse(ref ReadOnlySequence buffer, out SerialStructEventArgs serialEvent) + private bool TryParse(ref ReadOnlySequence buffer, + out SerialStructEventArgs serialEvent) { SequenceReader reader = new(buffer); serialEvent = default!; diff --git a/Toolkit.UI.WinUI/ItemContainerInvokedBehavior.cs b/Toolkit.UI.WinUI/ItemContainerInvokedBehavior.cs new file mode 100644 index 0000000..66a0a12 --- /dev/null +++ b/Toolkit.UI.WinUI/ItemContainerInvokedBehavior.cs @@ -0,0 +1,86 @@ +using Microsoft.UI.Xaml; +using System; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Media; +using Microsoft.Xaml.Interactivity; + +namespace Toolkit.UI.WinUI; + +public class ItemContainerInvokedBehavior : + Trigger +{ + private ItemsView? itemsView; + + protected override void OnAttached() + { + base.OnAttached(); + if (AssociatedObject is not null) + { + AssociatedObject.Loaded += OnLoaded; + AssociatedObject.Unloaded += OnUnloaded; + } + } + + protected override void OnDetaching() + { + base.OnDetaching(); + if (AssociatedObject is not null) + { + AssociatedObject.Loaded -= OnLoaded; + AssociatedObject.Unloaded -= OnUnloaded; + } + DetachFromItemsView(); + } + + private void OnLoaded(object sender, RoutedEventArgs args) + { + if (AssociatedObject is not null) + { + itemsView = FindAncestor(AssociatedObject); + if (itemsView is not null) + { + itemsView.SelectionChanged += OnSelectionChanged; + } + } + } + + private void OnUnloaded(object sender, RoutedEventArgs args) + { + DetachFromItemsView(); + if (AssociatedObject is not null) + { + AssociatedObject.Loaded -= OnLoaded; + AssociatedObject.Unloaded -= OnUnloaded; + } + } + + private void DetachFromItemsView() + { + if (itemsView is not null) + { + itemsView.SelectionChanged -= OnSelectionChanged; + itemsView = null; + } + } + + private static T? FindAncestor(DependencyObject current) where T : DependencyObject + { + while (current != null) + { + if (current is T ancestor) + { + return ancestor; + } + current = VisualTreeHelper.GetParent(current); + } + return null; + } + + private void OnSelectionChanged(ItemsView sender, ItemsViewSelectionChangedEventArgs args) + { + if (itemsView is not null && AssociatedObject is not null && AssociatedObject.DataContext == itemsView.SelectedItem) + { + Interaction.ExecuteActions(AssociatedObject, Actions, null); + } + } +} \ No newline at end of file diff --git a/Toolkit.UI.WinUI/ItemInvokedEventArgs.cs b/Toolkit.UI.WinUI/ItemInvokedEventArgs.cs new file mode 100644 index 0000000..25ccb35 --- /dev/null +++ b/Toolkit.UI.WinUI/ItemInvokedEventArgs.cs @@ -0,0 +1,5 @@ +using System; + +namespace Toolkit.UI.WinUI; + +public class ItemInvokedEventArgs : EventArgs;