Skip to content

Commit a3e2cfc

Browse files
authored
Merge pull request #259 from enisn/maui/SelectionView
Implement SelectionView for MAUI
2 parents 52722ce + a19c352 commit a3e2cfc

File tree

9 files changed

+139
-10
lines changed

9 files changed

+139
-10
lines changed

sandbox/SandboxMAUI/MainPage.xaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
<Button Text="Radio Button" Clicked="GoToRadioButtonPage" />
1313

1414
<Button Text="Advanced Entry &amp; FormView" Clicked="GoToAdvancedEntryPage" />
15-
15+
1616
<Button Text="Advanced Slider" Clicked="GoToAdvancedSliderPage" />
1717

18+
<Button Text="SelectionView" Clicked="GoToSelectionViewPage" />
19+
1820
</StackLayout>
1921
</ScrollView>
2022

sandbox/SandboxMAUI/MainPage.xaml.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,9 @@ async void GoToAdvancedSliderPage(System.Object sender, System.EventArgs e)
2727
{
2828
await Navigation.PushAsync(new AdvancedSliderPage());
2929
}
30+
31+
private async void GoToSelectionViewPage(object sender, EventArgs e)
32+
{
33+
await Navigation.PushAsync(new SelectionViewPage());
34+
}
3035
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
3+
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
4+
x:Class="SandboxMAUI.Pages.SelectionViewPage"
5+
xmlns:vm="clr-namespace:SandboxMAUI.ViewModels"
6+
xmlns:input="clr-namespace:InputKit.Shared.Controls;assembly=InputKit.Maui"
7+
Title="SelectionViewPage">
8+
<ContentPage.BindingContext>
9+
<vm:SampleItemsViewModel />
10+
</ContentPage.BindingContext>
11+
12+
<ContentPage.Content>
13+
14+
<StackLayout Padding="25" Spacing="15">
15+
<Picker x:Name="picker" SelectedIndexChanged="Picker_SelectedIndexChanged" />
16+
<Picker x:Name="labelPositionPicker" SelectedIndexChanged="LabelPositionChanged" />
17+
18+
<input:SelectionView
19+
x:Name="selectionView"
20+
ColumnNumber="2"
21+
ColumnSpacing="10"
22+
ItemDisplayBinding="{Binding Name}"
23+
ItemsSource="{Binding Items}"
24+
RowSpacing="10"
25+
SelectionType="Button" />
26+
</StackLayout>
27+
</ContentPage.Content>
28+
</ContentPage>
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using InputKit.Shared;
2+
3+
namespace SandboxMAUI.Pages;
4+
5+
public partial class SelectionViewPage : ContentPage
6+
{
7+
public SelectionViewPage()
8+
{
9+
InitializeComponent();
10+
picker.ItemsSource = Enum.GetValues(typeof(SelectionType));
11+
picker.SelectedItem = SelectionType.Button;
12+
13+
labelPositionPicker.SelectedItem = LabelPosition.Before;
14+
labelPositionPicker.ItemsSource = Enum.GetValues(typeof(LabelPosition));
15+
}
16+
17+
private void Picker_SelectedIndexChanged(object sender, EventArgs e)
18+
{
19+
selectionView.SelectionType = (SelectionType)picker.SelectedItem;
20+
}
21+
22+
private void LabelPositionChanged(object sender, EventArgs e)
23+
{
24+
if (sender is Picker pkr)
25+
{
26+
selectionView.LabelPosition = (LabelPosition)pkr.SelectedItem;
27+
}
28+
}
29+
}

sandbox/SandboxMAUI/SandboxMAUI.csproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,10 @@
6060
<ProjectReference Include="..\..\src\InputKit.Maui\InputKit.Maui.csproj" />
6161
</ItemGroup>
6262

63+
<ItemGroup>
64+
<MauiXaml Update="Pages\SelectionViewPage.xaml">
65+
<Generator>MSBuild:Compile</Generator>
66+
</MauiXaml>
67+
</ItemGroup>
68+
6369
</Project>
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using System.Collections.ObjectModel;
2+
using System.ComponentModel;
3+
using System.Runtime.CompilerServices;
4+
5+
namespace SandboxMAUI.ViewModels;
6+
public class SampleItemsViewModel : INotifyPropertyChanged
7+
{
8+
public IList<SampleItem> Items { get; set; } = new ObservableCollection<SampleItem>();
9+
private SampleItem _selectedItem;
10+
11+
public SampleItemsViewModel()
12+
{
13+
FillData();
14+
}
15+
16+
public SampleItem SelectedItem
17+
{
18+
get => _selectedItem;
19+
set { _selectedItem = value; OnPropertyChanged(); }
20+
}
21+
22+
void FillData()
23+
{
24+
for (int i = 0; i < 6; i++)
25+
{
26+
Items.Add(new SampleItem { Id = i, Name = "Option " + (i + 1) });
27+
}
28+
}
29+
30+
#region INotifyPropertyChanged Implementation
31+
public event PropertyChangedEventHandler PropertyChanged;
32+
public void OnPropertyChanged([CallerMemberName] string propName = "") => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
33+
#endregion
34+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace SandboxMAUI.ViewModels;
2+
3+
public class SampleItem
4+
{
5+
public int Id { get; set; }
6+
public string Name { get; set; }
7+
public override string ToString() => Name;
8+
}

sandbox/SandboxXF/SandboxXF/MainViewModel.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,9 @@ public MainViewModel()
1313
{
1414
FillData();
1515
}
16+
1617
public IList<SampleClass> MyList { get; set; } = new ObservableCollection<SampleClass>();
1718
private SampleClass _selectedItem;
18-
private int _selectedIndex;
19-
2019
public SampleClass SelectedItem
2120
{
2221
get => _selectedItem;

src/InputKit.Maui/Shared/Controls/SelectionView.cs

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ public partial class SelectionView : Grid
2424
public static GlobalSetting GlobalSetting { get; private set; } = new GlobalSetting
2525
{
2626
Color = InputKitOptions.GetAccentColor(),
27-
BackgroundColor = (Color)VisualElement.BackgroundColorProperty.DefaultValue,
27+
BackgroundColor = Colors.LightGray,
2828
BorderColor = (Color)Button.BorderColorProperty.DefaultValue,
2929
CornerRadius = 20,
3030
FontSize = Device.GetNamedSize(NamedSize.Default, typeof(Button)),
3131
Size = -1,
32-
TextColor = (Color)Button.TextColorProperty.DefaultValue,
32+
TextColor = (Color)Label.TextColorProperty.DefaultValue,
3333
LabelPosition = LabelPosition.After
3434
};
3535

@@ -209,6 +209,9 @@ private void UpdateView()
209209
if (ItemsSource == null) return;
210210

211211
Children.Clear();
212+
213+
SetRowAndColumnDefinitions();
214+
212215
SetValue(SelectedItemProperty, null);
213216
foreach (var item in ItemsSource)
214217
{
@@ -227,9 +230,10 @@ private void UpdateView()
227230
_View.IsDisabled = true;
228231

229232
var addedView = _View as View;
230-
this.Add(addedView,
231-
column: Children.Count % ColumnNumber,
232-
row: Children.Count % ColumnNumber);
233+
var column = Children.Count % ColumnNumber;
234+
var row = Children.Count / ColumnNumber;
235+
236+
this.Add(addedView, column, row);
233237

234238
_View.IsSelected = Children.Count == _selectedIndex; //to keep selected index when content is changed
235239
}
@@ -240,6 +244,21 @@ private void UpdateView()
240244
}
241245
}
242246

247+
248+
protected void SetRowAndColumnDefinitions()
249+
{
250+
this.ColumnDefinitions.Clear();
251+
for (int i = 0; i < ColumnNumber; i++)
252+
{
253+
this.ColumnDefinitions.Add(new ColumnDefinition(GridLength.Star));
254+
}
255+
256+
this.RowDefinitions.Clear();
257+
for (int i = 0; i < ItemsSource.Count / ColumnNumber; i++)
258+
{
259+
this.RowDefinitions.Add(new RowDefinition(GridLength.Auto));
260+
}
261+
}
243262
/// <summary>
244263
/// Updates colors of inside, when color property changed on runtime
245264
/// </summary>
@@ -426,7 +445,6 @@ public class SelectableButton : Button, ISelection
426445
private Color _selectionColor = InputKitOptions.GetAccentColor();
427446
private Color _unselectedColor;
428447

429-
430448
/// <summary>
431449
/// Default constructor
432450
/// </summary>
@@ -497,7 +515,7 @@ private void UpdateColors()
497515
else
498516
{
499517
BackgroundColor = UnselectedColor;
500-
TextColor = GlobalSetting.TextColor;
518+
TextColor = GlobalSetting.TextColor ?? UnselectedColor?.ToSurfaceColor();
501519
}
502520
}
503521

0 commit comments

Comments
 (0)