diff --git a/src/MAUI/Maui.Samples/ApiKeyPage.xaml b/src/MAUI/Maui.Samples/ApiKeyPage.xaml
new file mode 100644
index 0000000000..7f05d57d68
--- /dev/null
+++ b/src/MAUI/Maui.Samples/ApiKeyPage.xaml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/ApiKeyPage.xaml.cs b/src/MAUI/Maui.Samples/ApiKeyPage.xaml.cs
new file mode 100644
index 0000000000..6f64c1dcd3
--- /dev/null
+++ b/src/MAUI/Maui.Samples/ApiKeyPage.xaml.cs
@@ -0,0 +1,9 @@
+namespace ArcGIS;
+
+public partial class ApiKeyPage : ContentPage
+{
+ public ApiKeyPage()
+ {
+ InitializeComponent();
+ }
+}
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/ApiKeyPrompt.xaml b/src/MAUI/Maui.Samples/ApiKeyView.xaml
similarity index 90%
rename from src/MAUI/Maui.Samples/ApiKeyPrompt.xaml
rename to src/MAUI/Maui.Samples/ApiKeyView.xaml
index ddbe60678a..4459114c12 100644
--- a/src/MAUI/Maui.Samples/ApiKeyPrompt.xaml
+++ b/src/MAUI/Maui.Samples/ApiKeyView.xaml
@@ -1,10 +1,9 @@
-
-
+ xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
+
-
-
\ No newline at end of file
+
+
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/ApiKeyPrompt.xaml.cs b/src/MAUI/Maui.Samples/ApiKeyView.xaml.cs
similarity index 96%
rename from src/MAUI/Maui.Samples/ApiKeyPrompt.xaml.cs
rename to src/MAUI/Maui.Samples/ApiKeyView.xaml.cs
index a65c494047..da0db8a983 100644
--- a/src/MAUI/Maui.Samples/ApiKeyPrompt.xaml.cs
+++ b/src/MAUI/Maui.Samples/ApiKeyView.xaml.cs
@@ -12,9 +12,9 @@
namespace ArcGIS
{
[XamlCompilation(XamlCompilationOptions.Compile)]
- public partial class ApiKeyPrompt : ContentPage
+ public partial class ApiKeyView : ContentView
{
- public ApiKeyPrompt()
+ public ApiKeyView()
{
InitializeComponent();
Initialize();
diff --git a/src/MAUI/Maui.Samples/App.xaml b/src/MAUI/Maui.Samples/App.xaml
index d75733a79c..ac106cb5c9 100644
--- a/src/MAUI/Maui.Samples/App.xaml
+++ b/src/MAUI/Maui.Samples/App.xaml
@@ -1,8 +1,8 @@
-
-
+
+
diff --git a/src/MAUI/Maui.Samples/App.xaml.cs b/src/MAUI/Maui.Samples/App.xaml.cs
index d793b4318a..facf5d1464 100644
--- a/src/MAUI/Maui.Samples/App.xaml.cs
+++ b/src/MAUI/Maui.Samples/App.xaml.cs
@@ -8,7 +8,7 @@ public App()
{
InitializeComponent();
- MainPage = new NavigationPage(new CategoryListPage() { });
+ MainPage = new AppShell();
Current = this;
}
}
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/AppShell.xaml b/src/MAUI/Maui.Samples/AppShell.xaml
new file mode 100644
index 0000000000..8f698a62a5
--- /dev/null
+++ b/src/MAUI/Maui.Samples/AppShell.xaml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/AppShell.xaml.cs b/src/MAUI/Maui.Samples/AppShell.xaml.cs
new file mode 100644
index 0000000000..0f3bf21822
--- /dev/null
+++ b/src/MAUI/Maui.Samples/AppShell.xaml.cs
@@ -0,0 +1,64 @@
+using ArcGIS.Samples.Managers;
+using ArcGIS.Samples.Shared.Managers;
+using ArcGIS.Samples.Shared.Models;
+
+namespace ArcGIS;
+
+public partial class AppShell : Shell
+{
+ public AppShell()
+ {
+ InitializeComponent();
+
+ Initialize();
+ }
+
+ private void Initialize()
+ {
+ this.Appearing += FirstLoaded;
+
+ SampleManager.Current.Initialize();
+
+ var samplesCategories = SampleManager.Current.FullTree.Items.OfType().ToList();
+ var allSamples = SampleManager.Current.AllSamples.ToList();
+
+ List flyoutItems = new List();
+
+ foreach (var category in samplesCategories)
+ {
+ FlyoutItem flyoutItem = new FlyoutItem();
+ flyoutItem.Title = category.Name;
+
+ ShellContent shellContent = new ShellContent();
+ //shellContent.Title = category.Name;
+ shellContent.Content = new CategoryPage(category);
+ shellContent.Route = $"{nameof(CategoryPage)}_{category.Name}";
+
+ flyoutItem.Items.Add(shellContent);
+
+ this.Items.Add(flyoutItem);
+ }
+ }
+
+ #region Check API Key
+ private void FirstLoaded(object sender, EventArgs e)
+ {
+ this.Appearing -= FirstLoaded;
+
+ _ = CheckApiKey();
+ }
+
+ private async Task CheckApiKey()
+ {
+ // Attempt to load a locally stored API key.
+ await ApiKeyManager.TrySetLocalKey();
+
+ // Check that the current API key is valid.
+ ApiKeyStatus status = await ApiKeyManager.CheckKeyValidity();
+ if (status != ApiKeyStatus.Valid)
+ {
+ await Navigation.PushAsync(new ApiKeyPage(), true);
+ }
+ }
+ #endregion
+}
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/ArcGIS.Samples.Maui.csproj b/src/MAUI/Maui.Samples/ArcGIS.Samples.Maui.csproj
index c20ad90a57..db491be66a 100644
--- a/src/MAUI/Maui.Samples/ArcGIS.Samples.Maui.csproj
+++ b/src/MAUI/Maui.Samples/ArcGIS.Samples.Maui.csproj
@@ -61,8 +61,8 @@
-
-
+
+
@@ -82,23 +82,20 @@
-
-
-
-
-
-
+
+
+
-
+
@@ -106,11 +103,19 @@
+
+
+
+
+
+
+
+
PreserveNewest
@@ -128,10 +133,13 @@
-
-
-
+
+
+
+
+
+
@@ -145,6 +153,38 @@
+
+ ApiKeyView.xaml
+
+
+ AppShell.xaml
+
+
+ ScreenshotView.xaml
+
+
+ SettingsPage.xaml
+
+
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
PreserveNewest
diff --git a/src/MAUI/Maui.Samples/CategoryListPage.xaml b/src/MAUI/Maui.Samples/CategoryListPage.xaml
deleted file mode 100644
index 8dd06e04bb..0000000000
--- a/src/MAUI/Maui.Samples/CategoryListPage.xaml
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/CategoryListPage.xaml.cs b/src/MAUI/Maui.Samples/CategoryListPage.xaml.cs
deleted file mode 100644
index 4286b23269..0000000000
--- a/src/MAUI/Maui.Samples/CategoryListPage.xaml.cs
+++ /dev/null
@@ -1,142 +0,0 @@
-// Copyright 2022 Esri.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at: http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific
-// language governing permissions and limitations under the License.
-
-using ArcGIS.Helpers;
-using ArcGIS.Samples.Managers;
-using ArcGIS.Samples.Shared.Managers;
-using ArcGIS.Samples.Shared.Models;
-using System.ComponentModel;
-using System.Runtime.CompilerServices;
-
-namespace ArcGIS
-{
- public partial class CategoryListPage
- {
- public CategoryListPage()
- {
- Initialize();
- InitializeComponent();
- }
-
- private void Initialize()
- {
- this.Appearing += FirstLoaded;
-
- // Initialize the sample manager.
- SampleManager.Current.Initialize();
-
- ViewModel = new SamplesSearchViewModel();
-
- // Update the binding.
- BindingContext = ViewModel;
-
-#if MACCATALYST || IOS
- // Workaround visibility binding bug on Mac Catalyst. Binding for visibility that starts as false does not behave correctly on iOS and Mac.
- ViewModel.PropertyChanged += MacVisibilityHandler;
-#endif
- }
-
- private void MacVisibilityHandler(object sender, PropertyChangedEventArgs e)
- {
- if (e.PropertyName == "IsSearchOpen")
- {
- SampleSearchResultList.IsVisible = ((SamplesSearchViewModel)sender).IsSearchOpen;
- }
- }
-
- private void FirstLoaded(object sender, EventArgs e)
- {
- this.Appearing -= FirstLoaded;
-
- _ = CheckApiKey();
- }
-
- private async Task CheckApiKey()
- {
- // Attempt to load a locally stored API key.
- await ApiKeyManager.TrySetLocalKey();
-
- // Check that the current API key is valid.
- ApiKeyStatus status = await ApiKeyManager.CheckKeyValidity();
- if (status != ApiKeyStatus.Valid)
- {
- await Navigation.PushAsync(new ApiKeyPrompt(), true);
- }
- }
-
- private async void OnItemTapped(object sender, ItemTappedEventArgs e)
- {
- // Get the selected category.
- var category = e.Item as SearchableTreeNode;
- var sample = e.Item as SampleInfo;
- if (category != null)
- {
- // Navigate to the listing page for the category.
- await Navigation.PushAsync(new SampleListPage(category.Name));
- }
- else if (sample != null)
- {
- // Navigate to the sample page
- _ = SampleLoader.LoadSample(sample, this);
- }
- }
-
- public SamplesSearchViewModel ViewModel { get; set; }
-
- private async void SettingsClicked(object sender, EventArgs e)
- {
- await Navigation.PushAsync(new SettingsPage(), true);
- }
- }
-
- public class SamplesSearchViewModel : INotifyPropertyChanged
- {
- public List SampleCategories { get; }
- public List SearchResults => _allSamples.Where(SearchFunction).ToList();
- private readonly List _allSamples;
- private string _query = "";
-
- public SamplesSearchViewModel()
- {
- SampleCategories = SampleManager.Current.FullTree.Items.OfType().ToList();
- _allSamples = SampleManager.Current.AllSamples.ToList();
- }
-
- public string SearchQuery
- {
- get { return _query; }
- set
- {
- if (value != _query)
- {
- _query = value ?? ""; // Need to guard against null on X.F ios - happens when canceling search.
- OnPropertyChanged();
- OnPropertyChanged(nameof(SearchResults));
- OnPropertyChanged(nameof(IsSearchOpen));
- OnPropertyChanged(nameof(IsCategoriesOpen));
- }
- }
- }
-
- public bool IsSearchOpen => !string.IsNullOrWhiteSpace(_query);
- public bool IsCategoriesOpen => string.IsNullOrWhiteSpace(_query);
-
- private bool SearchFunction(SampleInfo sample)
- {
- return SampleManager.Current.SampleSearchFunc(sample, SearchQuery);
- }
-
- public event PropertyChangedEventHandler PropertyChanged;
-
- protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
- {
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
- }
- }
-}
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/CategoryPage.xaml b/src/MAUI/Maui.Samples/CategoryPage.xaml
new file mode 100644
index 0000000000..a526d323a8
--- /dev/null
+++ b/src/MAUI/Maui.Samples/CategoryPage.xaml
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/CategoryPage.xaml.cs b/src/MAUI/Maui.Samples/CategoryPage.xaml.cs
new file mode 100644
index 0000000000..c881530a59
--- /dev/null
+++ b/src/MAUI/Maui.Samples/CategoryPage.xaml.cs
@@ -0,0 +1,95 @@
+using ArcGIS.Helpers;
+using ArcGIS.Samples.Managers;
+using ArcGIS.Samples.Shared.Models;
+using ArcGIS.ViewModels;
+using CommunityToolkit.Maui.Views;
+
+namespace ArcGIS;
+
+public partial class CategoryPage : ContentPage
+{
+ private SearchableTreeNode _category;
+
+ public CategoryPage(SearchableTreeNode category)
+ {
+ _category = category;
+
+ InitializeComponent();
+
+ Initialize();
+ }
+
+ private void Initialize()
+ {
+ SetBindingContext();
+
+ Title = _category.Name;
+ }
+
+ private void SetBindingContext()
+ {
+ // Get the samples from the category.
+ var listSampleItems = _category?.Items.OfType().ToList();
+
+ // Update the binding to show the samples.
+ BindingContext = new CategoryViewModel(listSampleItems, _category.Name);
+ }
+
+ private async void SettingsClicked(object sender, EventArgs e)
+ {
+ await this.Navigation.PushAsync(new SettingsPage(), true);
+ }
+
+ private async void SearchClicked(object sender, EventArgs e)
+ {
+ var popup = new SearchPopup();
+
+ var result = await this.ShowPopupAsync(popup);
+ }
+
+ private void TapGestureRecognizer_SampleTapped(object sender, TappedEventArgs e)
+ {
+ var sampleInfo = e.Parameter as SampleInfo;
+ _ = SampleLoader.LoadSample(sampleInfo);
+ }
+
+ private void PointerGestureRecognizer_PointerEntered(object sender, PointerEventArgs e)
+ {
+ var view = (Border)sender;
+
+ var grid = (Grid)view.Content;
+
+ var imageButton = (Button)grid.Children[1];
+
+ imageButton.IsVisible = true;
+
+ Console.WriteLine("PointerRecognized");
+ }
+
+ private void PointerGestureRecognizer_PointerExited(object sender, PointerEventArgs e)
+ {
+ var view = (Border)sender;
+
+ var grid = (Grid)view.Content;
+
+ var imageButton = (Button)grid.Children[1];
+
+ string sampleName = (string)imageButton.CommandParameter;
+
+ imageButton.IsVisible = false || SampleManager.Current.IsSampleFavorited(sampleName);
+ }
+
+ protected override void OnAppearing()
+ {
+ base.OnAppearing();
+
+ // Ensure the favorite category is up to date with the correct favorited samples.
+ if (_category.Name == "Favorites")
+ {
+ _category = SampleManager.Current.GetFavoritesCategory();
+ }
+
+ SetBindingContext();
+
+ }
+}
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/Converters/BoolToFavoriteGlyphConverter.cs b/src/MAUI/Maui.Samples/Converters/BoolToFavoriteGlyphConverter.cs
new file mode 100644
index 0000000000..e2b953f0f3
--- /dev/null
+++ b/src/MAUI/Maui.Samples/Converters/BoolToFavoriteGlyphConverter.cs
@@ -0,0 +1,23 @@
+using Microsoft.Maui.ApplicationModel;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ArcGIS.Converters
+{
+ public class BoolToFavoriteGlyphConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ return value is true ? (char)0xe2a8 : (char)0xe2a9;
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/src/MAUI/Maui.Samples/Converters/SampleToBitmapConverter.cs b/src/MAUI/Maui.Samples/Converters/SampleToBitmapConverter.cs
new file mode 100644
index 0000000000..9e4b201e24
--- /dev/null
+++ b/src/MAUI/Maui.Samples/Converters/SampleToBitmapConverter.cs
@@ -0,0 +1,73 @@
+using System.Globalization;
+using System.Reflection;
+
+namespace ArcGIS.Converters
+{
+ public class SampleToBitmapConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ try
+ {
+ string platform = string.Empty;
+#if WINDOWS
+ platform = "_windows";
+#elif ANDROID
+ platform = "_android";
+#elif MACCATALYST
+ platform = "_maccatalyst";
+#elif IOS
+ platform = "_ios";
+#endif
+
+ ImageSource image = null;
+
+ string imagePath = value.ToString();
+ List folders = new List();
+
+#if MACCATALYST || ANDROID || IOS
+ folders = imagePath.Split('/').ToList();
+#elif WINDOWS
+ folders = imagePath.Split('\\').ToList();
+#endif
+ string fileName = folders.Last();
+
+ var assembly = Assembly.GetExecutingAssembly();
+ string imageResource = assembly.GetManifestResourceNames().Single(n => n.EndsWith(fileName));
+ var sourceStream = assembly.GetManifestResourceStream(imageResource);
+ var memoryStream = new MemoryStream();
+ sourceStream.CopyTo(memoryStream);
+ byte[] bytes = memoryStream.ToArray();
+ memoryStream.Close();
+
+ if (value != null)
+ {
+ image = ImageSource.FromStream(() =>
+ {
+ return new MemoryStream(bytes);
+ });
+ }
+ else
+ {
+ image = ImageSource.FromFile($@"Resources/Thumbnails/placeholder{platform}.jpg");
+ }
+
+ if (image != null)
+ {
+ return image;
+ };
+ }
+ catch (Exception)
+ {
+ // ignored
+ }
+
+ return null;
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/src/MAUI/Maui.Samples/Helpers/SampleLoader.cs b/src/MAUI/Maui.Samples/Helpers/SampleLoader.cs
index de7cface19..1111d6d172 100644
--- a/src/MAUI/Maui.Samples/Helpers/SampleLoader.cs
+++ b/src/MAUI/Maui.Samples/Helpers/SampleLoader.cs
@@ -22,10 +22,13 @@ internal static class SampleLoader
"OAuth",};
// Used to load a sample from the search or list in a category.
- public static async Task LoadSample(SampleInfo sampleInfo, NavigableElement nav)
+ public static async Task LoadSample(SampleInfo sampleInfo)
{
try
{
+ // Set the currently selected sample.
+ SampleManager.Current.SelectedSample = sampleInfo;
+
// Restore API key if leaving named user sample.
if (_namedUserSamples.Contains(SampleManager.Current?.SelectedSample?.FormalName))
{
@@ -54,7 +57,7 @@ public static async Task LoadSample(SampleInfo sampleInfo, NavigableElement nav)
// Show the wait page.
var waitPage = new WaitPage(cancellationSource) { Title = sampleInfo.SampleName };
- await nav.Navigation.PushModalAsync(waitPage, false);
+ await Shell.Current.Navigation.PushModalAsync(waitPage, false);
// Wait for the sample data download.
await DataManager.EnsureSampleDataPresent(sampleInfo, cancellationSource.Token, (info) =>
@@ -63,7 +66,7 @@ await DataManager.EnsureSampleDataPresent(sampleInfo, cancellationSource.Token,
});
// Remove the waiting page.
- await nav.Navigation.PopModalAsync(false);
+ await Shell.Current.Navigation.PopModalAsync(false);
}
// Get the sample control from the selected sample.
@@ -73,12 +76,12 @@ await DataManager.EnsureSampleDataPresent(sampleInfo, cancellationSource.Token,
SamplePage page = new SamplePage(sampleControl, sampleInfo);
// Show the sample.
- await nav.Navigation.PushAsync(page, true);
+ await Shell.Current.Navigation.PushAsync(page, true);
}
catch (OperationCanceledException)
{
// Remove the waiting page.
- await nav.Navigation.PopModalAsync(false);
+ await Shell.Current.Navigation.PopModalAsync(false);
await Application.Current.MainPage.DisplayAlert("", "Download cancelled", "OK");
}
diff --git a/src/MAUI/Maui.Samples/MauiProgram.cs b/src/MAUI/Maui.Samples/MauiProgram.cs
index 1888723cb2..58dfb74dc1 100644
--- a/src/MAUI/Maui.Samples/MauiProgram.cs
+++ b/src/MAUI/Maui.Samples/MauiProgram.cs
@@ -1,6 +1,7 @@
namespace ArcGIS.Samples.Maui;
using Esri.ArcGISRuntime.Maui;
+using CommunityToolkit.Maui;
public static class MauiProgram
{
@@ -9,6 +10,7 @@ public static MauiApp CreateMauiApp()
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp()
+ .UseMauiCommunityToolkit()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
diff --git a/src/MAUI/Maui.Samples/Platforms/Android/Helpers/KeyboardHelper.cs b/src/MAUI/Maui.Samples/Platforms/Android/Helpers/KeyboardHelper.cs
new file mode 100644
index 0000000000..6c21096b90
--- /dev/null
+++ b/src/MAUI/Maui.Samples/Platforms/Android/Helpers/KeyboardHelper.cs
@@ -0,0 +1,24 @@
+using Android.Content;
+using Android.Views.InputMethods;
+using Microsoft.Maui.ApplicationModel;
+
+namespace ArcGIS.Platforms.Helpers
+{
+ public static partial class KeyboardHelper
+ {
+ public static void HideKeyboard()
+ {
+ var context = Platform.AppContext;
+ var inputMethodManager = context.GetSystemService(Context.InputMethodService) as InputMethodManager;
+
+ if (inputMethodManager != null)
+ {
+ var activity = Platform.CurrentActivity;
+ var token = activity.CurrentFocus?.WindowToken;
+ inputMethodManager.HideSoftInputFromWindow(token, HideSoftInputFlags.None);
+ activity.Window.DecorView.ClearFocus();
+
+ }
+ }
+ }
+}
diff --git a/src/MAUI/Maui.Samples/Platforms/iOS/Helpers/KeyboardHelper.cs b/src/MAUI/Maui.Samples/Platforms/iOS/Helpers/KeyboardHelper.cs
new file mode 100644
index 0000000000..c57d02acee
--- /dev/null
+++ b/src/MAUI/Maui.Samples/Platforms/iOS/Helpers/KeyboardHelper.cs
@@ -0,0 +1,12 @@
+using UIKit;
+
+namespace ArcGIS.Platforms.Helpers
+{
+ public static partial class KeyboardHelper
+ {
+ public static void HideKeyboard()
+ {
+ UIApplication.SharedApplication.KeyWindow.EndEditing(true);
+ }
+ }
+}
diff --git a/src/MAUI/Maui.Samples/Resources/Icons/bulletpoint.svg b/src/MAUI/Maui.Samples/Resources/Icons/bulletpoint.svg
new file mode 100644
index 0000000000..ded67bcad2
--- /dev/null
+++ b/src/MAUI/Maui.Samples/Resources/Icons/bulletpoint.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/Resources/Icons/bulletpointdark.svg b/src/MAUI/Maui.Samples/Resources/Icons/bulletpointdark.svg
new file mode 100644
index 0000000000..4297827a42
--- /dev/null
+++ b/src/MAUI/Maui.Samples/Resources/Icons/bulletpointdark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/Resources/Icons/camera.svg b/src/MAUI/Maui.Samples/Resources/Icons/camera.svg
new file mode 100644
index 0000000000..94e880e9eb
--- /dev/null
+++ b/src/MAUI/Maui.Samples/Resources/Icons/camera.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/Resources/Icons/clear.svg b/src/MAUI/Maui.Samples/Resources/Icons/clear.svg
new file mode 100644
index 0000000000..72c7cd6e98
--- /dev/null
+++ b/src/MAUI/Maui.Samples/Resources/Icons/clear.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/Resources/Icons/documentation.svg b/src/MAUI/Maui.Samples/Resources/Icons/documentation.svg
index cd877c7cb6..bca5b36c55 100644
--- a/src/MAUI/Maui.Samples/Resources/Icons/documentation.svg
+++ b/src/MAUI/Maui.Samples/Resources/Icons/documentation.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/Resources/Icons/documentationdark.svg b/src/MAUI/Maui.Samples/Resources/Icons/documentationdark.svg
deleted file mode 100644
index 07e003cbdf..0000000000
--- a/src/MAUI/Maui.Samples/Resources/Icons/documentationdark.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/Resources/Icons/download.svg b/src/MAUI/Maui.Samples/Resources/Icons/download.svg
index 364c38ccad..465c3afe93 100644
--- a/src/MAUI/Maui.Samples/Resources/Icons/download.svg
+++ b/src/MAUI/Maui.Samples/Resources/Icons/download.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/Resources/Icons/downloaddark.svg b/src/MAUI/Maui.Samples/Resources/Icons/downloaddark.svg
deleted file mode 100644
index 465c3afe93..0000000000
--- a/src/MAUI/Maui.Samples/Resources/Icons/downloaddark.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/Resources/Icons/information.svg b/src/MAUI/Maui.Samples/Resources/Icons/information.svg
index 108ceb85af..bba4b20c61 100644
--- a/src/MAUI/Maui.Samples/Resources/Icons/information.svg
+++ b/src/MAUI/Maui.Samples/Resources/Icons/information.svg
@@ -1,4 +1,4 @@
diff --git a/src/MAUI/Maui.Samples/Resources/Icons/informationdark.svg b/src/MAUI/Maui.Samples/Resources/Icons/informationdark.svg
deleted file mode 100644
index 59c35526b9..0000000000
--- a/src/MAUI/Maui.Samples/Resources/Icons/informationdark.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/Resources/Icons/key.svg b/src/MAUI/Maui.Samples/Resources/Icons/key.svg
index d24c9911ef..4ad64fab55 100644
--- a/src/MAUI/Maui.Samples/Resources/Icons/key.svg
+++ b/src/MAUI/Maui.Samples/Resources/Icons/key.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/Resources/Icons/keydark.svg b/src/MAUI/Maui.Samples/Resources/Icons/keydark.svg
deleted file mode 100644
index 4ad64fab55..0000000000
--- a/src/MAUI/Maui.Samples/Resources/Icons/keydark.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/Resources/Icons/menu.svg b/src/MAUI/Maui.Samples/Resources/Icons/menu.svg
new file mode 100644
index 0000000000..56108c02f6
--- /dev/null
+++ b/src/MAUI/Maui.Samples/Resources/Icons/menu.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/Resources/Icons/minus.svg b/src/MAUI/Maui.Samples/Resources/Icons/minus.svg
new file mode 100644
index 0000000000..00354791b5
--- /dev/null
+++ b/src/MAUI/Maui.Samples/Resources/Icons/minus.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/Resources/Icons/minusdark.svg b/src/MAUI/Maui.Samples/Resources/Icons/minusdark.svg
new file mode 100644
index 0000000000..c88ddea661
--- /dev/null
+++ b/src/MAUI/Maui.Samples/Resources/Icons/minusdark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/Resources/Icons/plus.svg b/src/MAUI/Maui.Samples/Resources/Icons/plus.svg
new file mode 100644
index 0000000000..a3fd69ce87
--- /dev/null
+++ b/src/MAUI/Maui.Samples/Resources/Icons/plus.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/Resources/Icons/plusdark.svg b/src/MAUI/Maui.Samples/Resources/Icons/plusdark.svg
new file mode 100644
index 0000000000..6d21959aa9
--- /dev/null
+++ b/src/MAUI/Maui.Samples/Resources/Icons/plusdark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/Resources/Icons/search.svg b/src/MAUI/Maui.Samples/Resources/Icons/search.svg
new file mode 100644
index 0000000000..eef00b78a6
--- /dev/null
+++ b/src/MAUI/Maui.Samples/Resources/Icons/search.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/Resources/Icons/searchdark.svg b/src/MAUI/Maui.Samples/Resources/Icons/searchdark.svg
new file mode 100644
index 0000000000..6c944118a1
--- /dev/null
+++ b/src/MAUI/Maui.Samples/Resources/Icons/searchdark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/Resources/Icons/settingsdark.svg b/src/MAUI/Maui.Samples/Resources/Icons/settingsdark.svg
new file mode 100644
index 0000000000..aa1cb1a9b7
--- /dev/null
+++ b/src/MAUI/Maui.Samples/Resources/Icons/settingsdark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/Resources/Icons/star.svg b/src/MAUI/Maui.Samples/Resources/Icons/star.svg
new file mode 100644
index 0000000000..1a1a829831
--- /dev/null
+++ b/src/MAUI/Maui.Samples/Resources/Icons/star.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/Resources/Icons/stardark.svg b/src/MAUI/Maui.Samples/Resources/Icons/stardark.svg
new file mode 100644
index 0000000000..fa5919751a
--- /dev/null
+++ b/src/MAUI/Maui.Samples/Resources/Icons/stardark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/Resources/Icons/starfilled.svg b/src/MAUI/Maui.Samples/Resources/Icons/starfilled.svg
new file mode 100644
index 0000000000..51e531f3e3
--- /dev/null
+++ b/src/MAUI/Maui.Samples/Resources/Icons/starfilled.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/Resources/Icons/starfilleddark.svg b/src/MAUI/Maui.Samples/Resources/Icons/starfilleddark.svg
new file mode 100644
index 0000000000..51e531f3e3
--- /dev/null
+++ b/src/MAUI/Maui.Samples/Resources/Icons/starfilleddark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/MAUI/Maui.Samples/Resources/Styles/Styles.xaml b/src/MAUI/Maui.Samples/Resources/Styles/Styles.xaml
index 07c9f752c6..a5dd46a587 100644
--- a/src/MAUI/Maui.Samples/Resources/Styles/Styles.xaml
+++ b/src/MAUI/Maui.Samples/Resources/Styles/Styles.xaml
@@ -1,8 +1,9 @@
-
+
-
+