From 00a2ed29b117ef9fb1740b68c0b5b869f995b1a6 Mon Sep 17 00:00:00 2001 From: Sebastian Szvetecz Date: Thu, 8 Feb 2024 13:09:06 +0100 Subject: [PATCH 1/9] Added ScrollViewer for peg list --- src/Codebreaker.WPF/Views/Pages/GamePage.xaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Codebreaker.WPF/Views/Pages/GamePage.xaml b/src/Codebreaker.WPF/Views/Pages/GamePage.xaml index b2852d29..5f503032 100644 --- a/src/Codebreaker.WPF/Views/Pages/GamePage.xaml +++ b/src/Codebreaker.WPF/Views/Pages/GamePage.xaml @@ -94,13 +94,13 @@ Margin="86,0,0,8" ViewModel="{Binding ViewModel, ElementName=Self, Mode=OneWay}" /> + + Date: Thu, 8 Feb 2024 13:09:28 +0100 Subject: [PATCH 2/9] Made ScrollViewer automatically scroll to last move --- src/Codebreaker.WPF/Helpers/PageExtensions.cs | 31 +++++++++++++++++++ .../Views/Pages/GamePage.xaml.cs | 22 ++++++++----- 2 files changed, 45 insertions(+), 8 deletions(-) create mode 100644 src/Codebreaker.WPF/Helpers/PageExtensions.cs diff --git a/src/Codebreaker.WPF/Helpers/PageExtensions.cs b/src/Codebreaker.WPF/Helpers/PageExtensions.cs new file mode 100644 index 00000000..3e4361cf --- /dev/null +++ b/src/Codebreaker.WPF/Helpers/PageExtensions.cs @@ -0,0 +1,31 @@ +using CommunityToolkit.Mvvm.Messaging; + +namespace Codebreaker.WPF.Helpers; + +internal static class PageExtensions +{ + public static void UnregisterAllOnUnloaded(this IMessenger messenger, FrameworkElement page) => + messenger.UnregisterAllOnUnloaded(page, page); + + public static void UnregisterAllOnUnloaded(this IMessenger messenger, FrameworkElement page, object messageRecepient) + { + void UnloadedCallback(object sender, RoutedEventArgs args) + { + messenger.UnregisterAll(messageRecepient); + page.Unloaded -= UnloadedCallback; + } + + page.Unloaded += UnloadedCallback; + } + + public static void CallOnceOnUnloaded(this FrameworkElement page, Action action) + { + void Callback(object sender, RoutedEventArgs args) + { + action?.Invoke(sender, args); + page.Unloaded -= Callback; + } + + page.Unloaded += Callback; + } +} diff --git a/src/Codebreaker.WPF/Views/Pages/GamePage.xaml.cs b/src/Codebreaker.WPF/Views/Pages/GamePage.xaml.cs index 23650aaf..db85fa13 100644 --- a/src/Codebreaker.WPF/Views/Pages/GamePage.xaml.cs +++ b/src/Codebreaker.WPF/Views/Pages/GamePage.xaml.cs @@ -1,8 +1,10 @@ using Codebreaker.ViewModels.Contracts.Services; +using Codebreaker.WPF.Helpers; +using CommunityToolkit.Mvvm.Messaging; namespace Codebreaker.WPF.Views.Pages; -public partial class GamePage : Page +public partial class GamePage : Page, IRecipient { private readonly INavigationService _navigationService; @@ -10,15 +12,10 @@ public GamePage() { ViewModel = App.Current.GetService(); _navigationService = App.Current.GetService(); - DataContext = this; - InitializeComponent(); - - //WeakReferenceMessenger.Default.Register(this, (r, m) => - //{ - // VisualStateManager.GoToElementState(MainGrid, m.GameMode.ToString(), true); - //}); + WeakReferenceMessenger.Default.Register(this); + WeakReferenceMessenger.Default.UnregisterAllOnUnloaded(this); } public GamePageViewModel ViewModel @@ -34,4 +31,13 @@ private async void Button_Click(object sender, RoutedEventArgs e) { await _navigationService.NavigateToAsync("TestPage"); } + + public void Receive(GameMoveMessage message) + { + if (message.GameMoveValue is not GameMoveValue.Completed) + return; + + pegScrollViewer.UpdateLayout(); + pegScrollViewer.ScrollToBottom(); + } } From 03703e0098fa0bcf59a6fa09b11649fd03547a55 Mon Sep 17 00:00:00 2001 From: Sebastian Szvetecz Date: Thu, 8 Feb 2024 13:10:00 +0100 Subject: [PATCH 3/9] Removed StackPanel to fix layout issues --- src/Codebreaker.WPF/Views/Pages/GamePage.xaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/Codebreaker.WPF/Views/Pages/GamePage.xaml b/src/Codebreaker.WPF/Views/Pages/GamePage.xaml index 5f503032..b898708d 100644 --- a/src/Codebreaker.WPF/Views/Pages/GamePage.xaml +++ b/src/Codebreaker.WPF/Views/Pages/GamePage.xaml @@ -15,9 +15,6 @@ - -