Skip to content

Commit 56a2a76

Browse files
Merge pull request #166 from CodebreakerApp/99-use-vsm-to-change-visibility-with-game-windows
99 use vsm to change visibility with game windows
2 parents d9a3c59 + c9aa13c commit 56a2a76

5 files changed

Lines changed: 92 additions & 31 deletions

File tree

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

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,23 @@
2020
<VisualStateGroup>
2121
<VisualState x:Name="Start">
2222
<VisualState.Setters>
23-
<Setter TargetName="StartGameArea" Property="IsVisible" Value="True" />
24-
<Setter TargetName="PegSelectionArea" Property="IsVisible" Value="False" />
25-
<Setter TargetName="PegScrollView" Property="IsVisible" Value="False" />
23+
<Setter TargetName="StartGameArea" Property="FlexLayout.IsVisible" Value="True" />
24+
<Setter TargetName="PegSelectionArea" Property="components:PegSelectionView.IsVisible" Value="False" />
25+
<Setter TargetName="PegScrollView" Property="ScrollView.IsVisible" Value="False" />
2626
</VisualState.Setters>
2727
</VisualState>
2828
<VisualState x:Name="Playing">
2929
<VisualState.Setters>
30-
<Setter TargetName="StartGameArea" Property="IsVisible" Value="False" />
31-
<Setter TargetName="PegSelectionArea" Property="IsVisible" Value="True" />
32-
<Setter TargetName="PegScrollView" Property="IsVisible" Value="True" />
30+
<Setter TargetName="StartGameArea" Property="FlexLayout.IsVisible" Value="False" />
31+
<Setter TargetName="PegSelectionArea" Property="components:PegSelectionView.IsVisible" Value="True" />
32+
<Setter TargetName="PegScrollView" Property="ScrollView.IsVisible" Value="True" />
3333
</VisualState.Setters>
3434
</VisualState>
3535
<VisualState x:Name="Finished">
3636
<VisualState.Setters>
37-
<Setter TargetName="StartGameArea" Property="IsVisible" Value="False" />
38-
<Setter TargetName="PegSelectionArea" Property="IsVisible" Value="False" />
39-
<Setter TargetName="PegScrollView" Property="IsVisible" Value="True" />
37+
<Setter TargetName="StartGameArea" Property="FlexLayout.IsVisible" Value="False" />
38+
<Setter TargetName="PegSelectionArea" Property="components:PegSelectionView.IsVisible" Value="False" />
39+
<Setter TargetName="PegScrollView" Property="ScrollView.IsVisible" Value="True" />
4040
</VisualState.Setters>
4141
</VisualState>
4242
</VisualStateGroup>
@@ -90,7 +90,6 @@
9090

9191
<ScrollView Grid.Row="2" Padding="0,15,0,15" x:Name="PegScrollView" HorizontalOptions="CenterAndExpand">
9292
<ListView
93-
x:Name="test"
9493
HorizontalOptions="FillAndExpand"
9594
SelectionMode="None"
9695
ItemsSource="{Binding GameMoves, Mode=OneWay}"

src/Codebreaker.MAUI/Views/Pages/GamePage.xaml.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public GamePage(GamePageViewModel viewModel, INavigationService navigationServic
1414
BindingContext = viewModel;
1515
WeakReferenceMessenger.Default.RegisterAll(this);
1616
ViewModel.PropertyChanged += ViewModel_PropertyChanged;
17-
this.GoToState("Start");
17+
ContentWrapper.GoToState("Start");
1818
}
1919

2020
public GamePageViewModel ViewModel { get; }
@@ -44,7 +44,7 @@ private void ViewModel_PropertyChanged(object? sender, System.ComponentModel.Pro
4444
GameMode.Won or GameMode.Lost => "Finished",
4545
_ => "Start",
4646
};
47-
this.GoToState(stateName);
47+
ContentWrapper.GoToState(stateName);
4848
}
4949

5050
private async void Button_Clicked(object sender, EventArgs e)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace Codebreaker.WPF.Helpers;
2+
3+
internal static class VisualStateHelpers
4+
{
5+
public static bool GoToState(this FrameworkElement element, string visualStateName, bool useTransitions = true) =>
6+
VisualStateManager.GoToElementState(element, visualStateName, useTransitions);
7+
}

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

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

17-
<Grid>
17+
<Grid x:Name="ContentWrapper">
18+
<VisualStateManager.VisualStateGroups>
19+
<VisualStateGroup x:Name="Test">
20+
<VisualState x:Name="Start">
21+
<Storyboard>
22+
<ObjectAnimationUsingKeyFrames BeginTime="0" Duration="0" Storyboard.TargetName="StartGameArea" Storyboard.TargetProperty="Visibility">
23+
<DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}" />
24+
</ObjectAnimationUsingKeyFrames>
25+
<ObjectAnimationUsingKeyFrames BeginTime="0" Duration="0" Storyboard.TargetName="PegSelectionArea" Storyboard.TargetProperty="Visibility">
26+
<DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Collapsed}" />
27+
</ObjectAnimationUsingKeyFrames>
28+
<ObjectAnimationUsingKeyFrames BeginTime="0" Duration="0" Storyboard.TargetName="PegScrollViewer" Storyboard.TargetProperty="Visibility">
29+
<DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Collapsed}" />
30+
</ObjectAnimationUsingKeyFrames>
31+
</Storyboard>
32+
</VisualState>
33+
<VisualState x:Name="Playing">
34+
<Storyboard>
35+
<ObjectAnimationUsingKeyFrames BeginTime="0" Duration="0" Storyboard.TargetName="StartGameArea" Storyboard.TargetProperty="Visibility">
36+
<DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Collapsed}" />
37+
</ObjectAnimationUsingKeyFrames>
38+
<ObjectAnimationUsingKeyFrames BeginTime="0" Duration="0" Storyboard.TargetName="PegSelectionArea" Storyboard.TargetProperty="Visibility">
39+
<DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}" />
40+
</ObjectAnimationUsingKeyFrames>
41+
<ObjectAnimationUsingKeyFrames BeginTime="0" Duration="0" Storyboard.TargetName="PegScrollViewer" Storyboard.TargetProperty="Visibility">
42+
<DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}" />
43+
</ObjectAnimationUsingKeyFrames>
44+
</Storyboard>
45+
</VisualState>
46+
<VisualState x:Name="Finished">
47+
<Storyboard>
48+
<ObjectAnimationUsingKeyFrames BeginTime="0" Duration="0" Storyboard.TargetName="StartGameArea" Storyboard.TargetProperty="Visibility">
49+
<DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Collapsed}" />
50+
</ObjectAnimationUsingKeyFrames>
51+
<ObjectAnimationUsingKeyFrames BeginTime="0" Duration="0" Storyboard.TargetName="PegSelectionArea" Storyboard.TargetProperty="Visibility">
52+
<DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Collapsed}" />
53+
</ObjectAnimationUsingKeyFrames>
54+
<ObjectAnimationUsingKeyFrames BeginTime="0" Duration="0" Storyboard.TargetName="PegScrollViewer" Storyboard.TargetProperty="Visibility">
55+
<DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}" />
56+
</ObjectAnimationUsingKeyFrames>
57+
</Storyboard>
58+
</VisualState>
59+
</VisualStateGroup>
60+
</VisualStateManager.VisualStateGroups>
61+
1862
<Grid.RowDefinitions>
1963
<RowDefinition Height="Auto" />
2064
<RowDefinition Height="Auto" />
@@ -26,7 +70,10 @@
2670
Panel.ZIndex="1"
2771
Grid.Row="0"/>
2872

29-
<Grid Grid.Row="1" Margin="8" Visibility="{Binding ViewModel.GameStatus, Mode=OneWay, Converter={StaticResource GameStatusVisibilityConverter}, ConverterParameter=Start}">
73+
<Grid
74+
x:Name="StartGameArea"
75+
Grid.Row="1"
76+
Margin="8">
3077
<Grid.RowDefinitions>
3178
<RowDefinition MinHeight="20" />
3279
<RowDefinition />
@@ -54,18 +101,17 @@
54101
</Grid>
55102

56103
<components:PegSelectionView
104+
x:Name="PegSelectionArea"
57105
Grid.Row="1"
58-
Visibility="{Binding ViewModel.GameStatus, Mode=OneWay, Converter={StaticResource GameStatusVisibilityConverter}, ConverterParameter=Cancelable}"
59106
Margin="86,0,0,8"
60107
ViewModel="{Binding ViewModel, ElementName=Self, Mode=OneWay}" />
61108

62-
<ScrollViewer Grid.Row="2" Padding="0,0,0,15" x:Name="pegScrollViewer">
109+
<ScrollViewer Grid.Row="2" Padding="0,0,0,15" x:Name="PegScrollViewer">
63110
<ListView
64111
BorderThickness="0"
65112
SelectedIndex="-1"
66113
IsHitTestVisible="False"
67114
HorizontalContentAlignment="Stretch"
68-
Visibility="{Binding ViewModel.GameStatus, Mode=OneWay, Converter={StaticResource GameStatusVisibilityConverter}, ConverterParameter=Running}"
69115
ItemsSource="{Binding ViewModel.GameMoves, Mode=OneWay}"
70116
ItemTemplate="{StaticResource PegsTemplate}" />
71117
</ScrollViewer>

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

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,28 +16,37 @@ public GamePage()
1616
InitializeComponent();
1717
WeakReferenceMessenger.Default.Register(this);
1818
WeakReferenceMessenger.Default.UnregisterAllOnUnloaded(this);
19+
ViewModel.PropertyChanged += ViewModel_PropertyChanged;
20+
ContentWrapper.GoToState("Start");
1921
}
2022

21-
public GamePageViewModel ViewModel
22-
{
23-
get => (GamePageViewModel)GetValue(ViewModelProperty);
24-
set => SetValue(ViewModelProperty, value);
25-
}
23+
public GamePageViewModel ViewModel { get; }
2624

27-
public static readonly DependencyProperty ViewModelProperty =
28-
DependencyProperty.Register("ViewModel", typeof(GamePageViewModel), typeof(GamePage), new PropertyMetadata(null));
29-
30-
private async void Button_Click(object sender, RoutedEventArgs e)
25+
public void Receive(GameMoveMessage message)
3126
{
32-
await _navigationService.NavigateToAsync("TestPage");
27+
if (message.GameMoveValue is not GameMoveValue.Completed)
28+
return;
29+
30+
PegScrollViewer.UpdateLayout();
31+
PegScrollViewer.ScrollToBottom();
3332
}
3433

35-
public void Receive(GameMoveMessage message)
34+
private void ViewModel_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
3635
{
37-
if (message.GameMoveValue is not GameMoveValue.Completed)
36+
if (e.PropertyName != nameof(GamePageViewModel.GameStatus))
3837
return;
3938

40-
pegScrollViewer.UpdateLayout();
41-
pegScrollViewer.ScrollToBottom();
39+
var stateName = ViewModel.GameStatus switch
40+
{
41+
GameMode.Started or GameMode.MoveSet => "Playing",
42+
GameMode.Won or GameMode.Lost => "Finished",
43+
_ => "Start"
44+
};
45+
ContentWrapper.GoToState(stateName);
46+
}
47+
48+
private async void Button_Click(object sender, RoutedEventArgs e)
49+
{
50+
await _navigationService.NavigateToAsync("TestPage");
4251
}
4352
}

0 commit comments

Comments
 (0)