Skip to content

Commit 8ddbdcb

Browse files
Platform code for CategoryPage CollectionView span (#1479)
Co-authored-by: Hamish Duff <[email protected]> Co-authored-by: Hamish Duff <[email protected]>
1 parent c34557c commit 8ddbdcb

File tree

2 files changed

+51
-18
lines changed

2 files changed

+51
-18
lines changed

src/MAUI/Maui.Samples/Views/CategoryPage.xaml

+35-10
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,37 @@
66
xmlns:models="clr-namespace:ArcGIS.Samples.Shared.Models"
77
xmlns:viewModels="clr-namespace:ArcGIS.ViewModels"
88
Title="{Binding SelectedCategory}"
9-
Shell.FlyoutBehavior="Flyout"
10-
x:DataType="viewModels:CategoryViewModel">
9+
x:DataType="viewModels:CategoryViewModel"
10+
Shell.FlyoutBehavior="Flyout">
11+
12+
<ContentPage.Resources>
13+
<converters:SampleToBitmapConverter x:Key="SampleToBitmapConverter" />
14+
<converters:BoolToFavoriteGlyphConverter x:Key="BoolToFavoriteGlyphConverter" />
15+
<Style x:Key="AndroidStyle" TargetType="CollectionView">
16+
<Setter Property="VisualStateManager.VisualStateGroups">
17+
<VisualStateGroupList>
18+
<VisualStateGroup>
19+
<VisualState x:Name="Horizontal">
20+
<VisualState.StateTriggers>
21+
<OrientationStateTrigger Orientation="Landscape" />
22+
</VisualState.StateTriggers>
23+
<VisualState.Setters>
24+
<Setter Property="ItemsLayout" Value="{OnIdiom Phone='VerticalGrid, 2', Tablet='VerticalGrid, 3'}" />
25+
</VisualState.Setters>
26+
</VisualState>
27+
<VisualState x:Name="Vertical">
28+
<VisualState.StateTriggers>
29+
<OrientationStateTrigger Orientation="Portrait" />
30+
</VisualState.StateTriggers>
31+
<VisualState.Setters>
32+
<Setter Property="ItemsLayout" Value="{OnIdiom Phone='VerticalGrid, 1', Tablet='VerticalGrid, 2'}" />
33+
</VisualState.Setters>
34+
</VisualState>
35+
</VisualStateGroup>
36+
</VisualStateGroupList>
37+
</Setter>
38+
</Style>
39+
</ContentPage.Resources>
1140

1241
<ContentPage.ToolbarItems>
1342
<ToolbarItem Clicked="SearchClicked"
@@ -20,25 +49,19 @@
2049
IconImageSource="feedback.png"
2150
Text="Feedback" />
2251
</ContentPage.ToolbarItems>
23-
<ContentPage.Resources>
24-
<converters:SampleToBitmapConverter x:Key="SampleToBitmapConverter" />
25-
<converters:BoolToFavoriteGlyphConverter x:Key="BoolToFavoriteGlyphConverter" />
26-
</ContentPage.Resources>
52+
2753
<CollectionView x:Name="SamplesCollection"
2854
BackgroundColor="Transparent"
2955
ItemsSource="{Binding SamplesItems}">
3056
<CollectionView.ItemsLayout>
3157
<GridItemsLayout x:Name="SamplesGridItemsLayout"
3258
HorizontalItemSpacing="5"
3359
Orientation="Vertical"
34-
Span="{OnPlatform Default=4,
35-
iOS=1,
36-
Android=1}"
3760
VerticalItemSpacing="5" />
3861
</CollectionView.ItemsLayout>
3962
<CollectionView.ItemTemplate>
4063
<DataTemplate x:DataType="viewModels:SampleViewModel">
41-
<Border StrokeThickness="{OnPlatform Default=0, Android=1}">
64+
<Border Margin="{OnPlatform Default=0, Android=5}" StrokeThickness="{OnPlatform Default=0, Android=1}">
4265
<Border.GestureRecognizers>
4366
<PointerGestureRecognizer PointerEntered="PointerGestureRecognizer_PointerEntered" />
4467
<PointerGestureRecognizer PointerExited="PointerGestureRecognizer_PointerExited" />
@@ -58,6 +81,8 @@
5881

5982
<Button x:Name="FavoriteButton"
6083
Grid.Row="0"
84+
Margin="{OnPlatform Default=0,
85+
WinUI='-1'}"
6186
Padding="2"
6287
Background="#A52F2F2F"
6388
Command="{Binding Source={RelativeSource AncestorType={x:Type viewModels:CategoryViewModel}}, Path=UpdateFavoriteCommand}"

src/MAUI/Maui.Samples/Views/CategoryPage.xaml.cs

+16-8
Original file line numberDiff line numberDiff line change
@@ -27,22 +27,30 @@ private void Initialize()
2727
BindingContext = _viewModel;
2828

2929
WeakReferenceMessenger.Default.Register<string>(this, (message, category) => ScrollToTop());
30+
31+
// Handle platform differences in updating the layout.
3032
#if !ANDROID
33+
// Event raised during an orientation state change or window resize.
3134
SizeChanged += (s, e) =>
3235
{
36+
var numberOfColumns = (int)Math.Floor(Width / _viewModel.SampleImageWidth);
3337
#if IOS || MACCATALYST
34-
var numberOfColumns = Math.Floor(Width / _viewModel.SampleImageWidth);
35-
var layout = new GridItemsLayout((int)numberOfColumns, ItemsLayoutOrientation.Vertical);
36-
layout.HorizontalItemSpacing = 5;
37-
layout.VerticalItemSpacing = 5;
38-
SamplesCollection.ItemsLayout = layout;
38+
// Don't update the layout when column count is the same, for example, when app height changes on Mac.
39+
if (numberOfColumns != (SamplesCollection.ItemsLayout as GridItemsLayout)?.Span)
40+
{
41+
SamplesCollection.ItemsLayout = new GridItemsLayout(numberOfColumns, ItemsLayoutOrientation.Vertical)
42+
{
43+
HorizontalItemSpacing = 5,
44+
VerticalItemSpacing = 5
45+
};
46+
}
3947
#elif WINDOWS
40-
var numberOfColumns = Math.Floor(Width / _viewModel.SampleImageWidth);
41-
SamplesGridItemsLayout.Span = (int)numberOfColumns;
48+
SamplesGridItemsLayout.Span = numberOfColumns;
4249
#endif
4350
};
51+
#else
52+
SamplesCollection.Style = Resources["AndroidStyle"] as Style;
4453
#endif
45-
4654
}
4755

4856
private async void FeedbackToolbarItem_Clicked(object sender, EventArgs e)

0 commit comments

Comments
 (0)