Skip to content

Commit d6de8ac

Browse files
Merge pull request #135 from CodebreakerApp/134-wpf-scrollviewer
134 wpf scrollviewer
2 parents 3bddb85 + 17d1927 commit d6de8ac

4 files changed

Lines changed: 109 additions & 73 deletions

File tree

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using CommunityToolkit.Mvvm.Messaging;
2+
3+
namespace Codebreaker.WPF.Helpers;
4+
5+
internal static class PageExtensions
6+
{
7+
public static void UnregisterAllOnUnloaded(this IMessenger messenger, FrameworkElement page) =>
8+
messenger.UnregisterAllOnUnloaded(page, page);
9+
10+
public static void UnregisterAllOnUnloaded(this IMessenger messenger, FrameworkElement page, object messageRecepient)
11+
{
12+
void UnloadedCallback(object sender, RoutedEventArgs args)
13+
{
14+
messenger.UnregisterAll(messageRecepient);
15+
page.Unloaded -= UnloadedCallback;
16+
}
17+
18+
page.Unloaded += UnloadedCallback;
19+
}
20+
21+
public static void CallOnceOnUnloaded(this FrameworkElement page, Action<object, RoutedEventArgs> action)
22+
{
23+
void Callback(object sender, RoutedEventArgs args)
24+
{
25+
action?.Invoke(sender, args);
26+
page.Unloaded -= Callback;
27+
}
28+
29+
page.Unloaded += Callback;
30+
}
31+
}

src/Codebreaker.WPF/Views/Pages/GamePage.xaml

Lines changed: 51 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,7 @@
1515
<conv:ColorNameToBrushConverter x:Key="ColorConverter" />
1616
</Page.Resources>
1717

18-
<StackPanel Orientation="Vertical">
19-
<Button Click="Button_Click" Content="To TestPage" />
20-
21-
<Grid>
18+
<Grid>
2219
<Grid.RowDefinitions>
2320
<RowDefinition Height="Auto" />
2421
<RowDefinition Height="Auto" />
@@ -28,35 +25,35 @@
2825

2926
<!--<StackPanel Orientation="Vertical" Grid.Row="0">
3027
--><!-- TODO: Create component for this, to make it (more) generic. --><!--
31-
<Grid Visibility="{Binding Path=ViewModel.InfoMessage.IsVisible, Mode=OneWay, Converter={StaticResource BooleanToVisibilityConverter}}">
32-
<Grid.ColumnDefinitions>
33-
<ColumnDefinition Width="Auto" />
34-
<ColumnDefinition Width="*" />
35-
<ColumnDefinition Width="Auto" />
36-
</Grid.ColumnDefinitions>
28+
<Grid Visibility="{Binding Path=ViewModel.InfoMessage.IsVisible, Mode=OneWay, Converter={StaticResource BooleanToVisibilityConverter}}">
29+
<Grid.ColumnDefinitions>
30+
<ColumnDefinition Width="Auto" />
31+
<ColumnDefinition Width="*" />
32+
<ColumnDefinition Width="Auto" />
33+
</Grid.ColumnDefinitions>
3734
38-
<TextBlock Text="Information: " VerticalAlignment="Center" Margin="8,0" />
39-
<TextBlock Grid.Column="1" Text="{Binding ViewModel.InfoMessage.Message, Mode=OneWay}" VerticalAlignment="Center" Margin="8,0" />
40-
<Button
41-
Grid.Column="2"
42-
Content="{Binding ViewModel.InfoMessage.ActionTitle, Mode=OneWay}" Padding="30,8"
43-
Command="{Binding ViewModel.InfoMessage.ActionCommand, Mode=OneWay}" />
44-
</Grid>
45-
<Grid Visibility="{Binding Path=ViewModel.ErrorMessage.IsVisible, Mode=OneWay, Converter={StaticResource BooleanToVisibilityConverter}}">
46-
<Grid.ColumnDefinitions>
47-
<ColumnDefinition Width="Auto" />
48-
<ColumnDefinition Width="*" />
49-
<ColumnDefinition Width="Auto" />
50-
</Grid.ColumnDefinitions>
35+
<TextBlock Text="Information: " VerticalAlignment="Center" Margin="8,0" />
36+
<TextBlock Grid.Column="1" Text="{Binding ViewModel.InfoMessage.Message, Mode=OneWay}" VerticalAlignment="Center" Margin="8,0" />
37+
<Button
38+
Grid.Column="2"
39+
Content="{Binding ViewModel.InfoMessage.ActionTitle, Mode=OneWay}" Padding="30,8"
40+
Command="{Binding ViewModel.InfoMessage.ActionCommand, Mode=OneWay}" />
41+
</Grid>
42+
<Grid Visibility="{Binding Path=ViewModel.ErrorMessage.IsVisible, Mode=OneWay, Converter={StaticResource BooleanToVisibilityConverter}}">
43+
<Grid.ColumnDefinitions>
44+
<ColumnDefinition Width="Auto" />
45+
<ColumnDefinition Width="*" />
46+
<ColumnDefinition Width="Auto" />
47+
</Grid.ColumnDefinitions>
5148
52-
<TextBlock Text="Error: " VerticalAlignment="Center" Margin="8,0" />
53-
<TextBlock Grid.Column="1" Text="{Binding ViewModel.ErrorMessage.Message, Mode=OneWay}" VerticalAlignment="Center" Margin="8,0" />
54-
<Button
55-
Grid.Column="2"
56-
Content="{Binding ViewModel.ErrorMessage.ActionTitle, Mode=OneWay}" Padding="30,8"
57-
Command="{Binding ViewModel.ErrorMessage.ActionCommand, Mode=OneWay}" />
58-
</Grid>
59-
</StackPanel>-->
49+
<TextBlock Text="Error: " VerticalAlignment="Center" Margin="8,0" />
50+
<TextBlock Grid.Column="1" Text="{Binding ViewModel.ErrorMessage.Message, Mode=OneWay}" VerticalAlignment="Center" Margin="8,0" />
51+
<Button
52+
Grid.Column="2"
53+
Content="{Binding ViewModel.ErrorMessage.ActionTitle, Mode=OneWay}" Padding="30,8"
54+
Command="{Binding ViewModel.ErrorMessage.ActionCommand, Mode=OneWay}" />
55+
</Grid>
56+
</StackPanel>-->
6057
<components:GameResultDisplay
6158
Panel.ZIndex="1"
6259
Grid.Row="0"/>
@@ -94,20 +91,30 @@
9491
Margin="86,0,0,8"
9592
ViewModel="{Binding ViewModel, ElementName=Self, Mode=OneWay}" />
9693

97-
<ListView
98-
Height="Auto"
99-
Visibility="{Binding ViewModel.GameStatus, Mode=OneWay, Converter={StaticResource GameStatusVisibilityConverter}, ConverterParameter=Running}"
100-
Grid.Row="2"
101-
Background="LightGray"
102-
ItemsSource="{Binding ViewModel.GameMoves, Mode=OneWay}"
103-
ItemTemplate="{StaticResource PegsTemplate}" />
94+
<ScrollViewer Grid.Row="2" Padding="0,0,0,15" x:Name="pegScrollViewer">
95+
<ListView
96+
BorderThickness="0"
97+
SelectedIndex="-1"
98+
IsHitTestVisible="False"
99+
HorizontalContentAlignment="Stretch"
100+
Visibility="{Binding ViewModel.GameStatus, Mode=OneWay, Converter={StaticResource GameStatusVisibilityConverter}, ConverterParameter=Running}"
101+
ItemsSource="{Binding ViewModel.GameMoves, Mode=OneWay}"
102+
ItemTemplate="{StaticResource PegsTemplate}" />
103+
</ScrollViewer>
104104

105-
<TextBlock Grid.Row="3" Text="{Binding ViewModel.GameStatus,Mode=OneWay}" />
105+
<Grid Grid.Row="3">
106+
<Grid.ColumnDefinitions>
107+
<ColumnDefinition Width="Auto" />
108+
<ColumnDefinition Width="*" />
109+
<ColumnDefinition Width="Auto" />
110+
</Grid.ColumnDefinitions>
111+
<TextBlock Grid.Column="0" Text="{Binding ViewModel.GameStatus,Mode=OneWay}" />
106112
<ProgressBar
107-
Grid.Row="3"
108-
Height="15"
109-
Minimum="0" Maximum="100" IsIndeterminate="True"
110-
Visibility="{Binding ViewModel.InProgress, Converter={StaticResource BooleanToVisibilityConverter}}" />
113+
Grid.Column="1"
114+
Height="15"
115+
Minimum="0" Maximum="100" IsIndeterminate="True"
116+
Visibility="{Binding ViewModel.InProgress, Converter={StaticResource BooleanToVisibilityConverter}}" />
117+
<Button Grid.Column="2" Click="Button_Click" Content="To TestPage" Padding="15,2" />
111118
</Grid>
112-
</StackPanel>
119+
</Grid>
113120
</Page>
Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,21 @@
11
using Codebreaker.ViewModels.Contracts.Services;
2+
using Codebreaker.WPF.Helpers;
3+
using CommunityToolkit.Mvvm.Messaging;
24

35
namespace Codebreaker.WPF.Views.Pages;
46

5-
public partial class GamePage : Page
7+
public partial class GamePage : Page, IRecipient<GameMoveMessage>
68
{
79
private readonly INavigationService _navigationService;
810

911
public GamePage()
1012
{
1113
ViewModel = App.Current.GetService<GamePageViewModel>();
1214
_navigationService = App.Current.GetService<INavigationService>();
13-
1415
DataContext = this;
15-
1616
InitializeComponent();
17-
18-
//WeakReferenceMessenger.Default.Register<GameStateChangedMessage>(this, (r, m) =>
19-
//{
20-
// VisualStateManager.GoToElementState(MainGrid, m.GameMode.ToString(), true);
21-
//});
17+
WeakReferenceMessenger.Default.Register(this);
18+
WeakReferenceMessenger.Default.UnregisterAllOnUnloaded(this);
2219
}
2320

2421
public GamePageViewModel ViewModel
@@ -34,4 +31,13 @@ private async void Button_Click(object sender, RoutedEventArgs e)
3431
{
3532
await _navigationService.NavigateToAsync("TestPage");
3633
}
34+
35+
public void Receive(GameMoveMessage message)
36+
{
37+
if (message.GameMoveValue is not GameMoveValue.Completed)
38+
return;
39+
40+
pegScrollViewer.UpdateLayout();
41+
pegScrollViewer.ScrollToBottom();
42+
}
3743
}

src/Codebreaker.WPF/Views/Templates/CodeBreakerTemplates.xaml

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,9 @@
44

55
<conv:KeyPegColorNameToBrushConverter x:Key="KeyPegColorNameToBrushConverter" />
66
<conv:ColorNameToBrushConverter x:Key="ColorConverter" />
7-
<!--<conv:ColorNameToBrushConverter x:Key="ColorConverter" />
8-
<conv:SelectionAndKeyPegToKeyVisibilityConverter x:Key="KeyPegVisibilityConverter" />
9-
<conv:IntToEnumerableConverter x:Key="IntToEnumerableConverter" />-->
107

118
<DataTemplate x:Key="PegsTemplate">
12-
<Grid Background="Transparent">
9+
<Grid Background="LightGray">
1310
<Grid.ColumnDefinitions>
1411
<ColumnDefinition Width="auto" />
1512
<ColumnDefinition Width="auto" />
@@ -29,23 +26,18 @@
2926
</ItemsControl.ItemTemplate>
3027
</ItemsControl>
3128

32-
<Grid Grid.Column="2">
33-
<Grid.RowDefinitions>
34-
<RowDefinition />
35-
</Grid.RowDefinitions>
36-
<ItemsControl Grid.Row="0" ItemsSource="{Binding Path=KeyPegs, Mode=OneTime}">
37-
<ItemsControl.ItemsPanel>
38-
<ItemsPanelTemplate>
39-
<StackPanel Orientation="Horizontal" />
40-
</ItemsPanelTemplate>
41-
</ItemsControl.ItemsPanel>
42-
<ItemsControl.ItemTemplate>
43-
<DataTemplate>
44-
<Ellipse Width="16" Height="16" Fill="{Binding Converter={StaticResource KeyPegColorNameToBrushConverter}}" Margin="10,0" />
45-
</DataTemplate>
46-
</ItemsControl.ItemTemplate>
47-
</ItemsControl>
48-
</Grid>
29+
<ItemsControl Grid.Column="2" ItemsSource="{Binding Path=KeyPegs, Mode=OneTime}">
30+
<ItemsControl.ItemsPanel>
31+
<ItemsPanelTemplate>
32+
<StackPanel Orientation="Horizontal" />
33+
</ItemsPanelTemplate>
34+
</ItemsControl.ItemsPanel>
35+
<ItemsControl.ItemTemplate>
36+
<DataTemplate>
37+
<Ellipse Width="16" Height="16" Fill="{Binding Converter={StaticResource KeyPegColorNameToBrushConverter}}" Margin="10,0" />
38+
</DataTemplate>
39+
</ItemsControl.ItemTemplate>
40+
</ItemsControl>
4941
</Grid>
5042
</DataTemplate>
5143
</ResourceDictionary>

0 commit comments

Comments
 (0)