diff --git a/8.0/Apps/GameOfLife/GameOfLife.sln b/8.0/Apps/GameOfLife/GameOfLife.sln
new file mode 100644
index 000000000..a21b402a6
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife.sln
@@ -0,0 +1,26 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.8.34525.116
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GameOfLife", "GameOfLife\GameOfLife.csproj", "{236EDA58-32B7-4789-8327-FCF9016E8621}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {236EDA58-32B7-4789-8327-FCF9016E8621}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {236EDA58-32B7-4789-8327-FCF9016E8621}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {236EDA58-32B7-4789-8327-FCF9016E8621}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {236EDA58-32B7-4789-8327-FCF9016E8621}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {236EDA58-32B7-4789-8327-FCF9016E8621}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {F4AE3140-D3C9-48F6-A9BB-B90F47B46A66}
+ EndGlobalSection
+EndGlobal
diff --git a/8.0/Apps/GameOfLife/GameOfLife/AboutPage.xaml b/8.0/Apps/GameOfLife/GameOfLife/AboutPage.xaml
new file mode 100644
index 000000000..d1214a88f
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/AboutPage.xaml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/AboutPage.xaml.cs b/8.0/Apps/GameOfLife/GameOfLife/AboutPage.xaml.cs
new file mode 100644
index 000000000..a256bc1d0
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/AboutPage.xaml.cs
@@ -0,0 +1,20 @@
+namespace GameOfLife;
+
+public partial class AboutPage : ContentPage
+{
+ public AboutPage()
+ {
+ InitializeComponent();
+ }
+
+ async void OnHyperlinkTapped(object sender, EventArgs args)
+ {
+ Label label = (Label)sender;
+ await Launcher.OpenAsync(label.Text);
+ }
+
+ async void OnCloseButtonClicked(object sender, EventArgs e)
+ {
+ await Navigation.PopModalAsync();
+ }
+}
diff --git a/8.0/Apps/GameOfLife/GameOfLife/App.xaml b/8.0/Apps/GameOfLife/GameOfLife/App.xaml
new file mode 100644
index 000000000..b468f4992
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/App.xaml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/App.xaml.cs b/8.0/Apps/GameOfLife/GameOfLife/App.xaml.cs
new file mode 100644
index 000000000..2f2b8c21c
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/App.xaml.cs
@@ -0,0 +1,12 @@
+namespace GameOfLife;
+
+public partial class App : Application
+{
+ public App()
+ {
+ InitializeComponent();
+
+ MainPage = new AppShell();
+ }
+}
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/AppShell.xaml b/8.0/Apps/GameOfLife/GameOfLife/AppShell.xaml
new file mode 100644
index 000000000..b25900119
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/AppShell.xaml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/AppShell.xaml.cs b/8.0/Apps/GameOfLife/GameOfLife/AppShell.xaml.cs
new file mode 100644
index 000000000..b5aae890b
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/AppShell.xaml.cs
@@ -0,0 +1,10 @@
+namespace GameOfLife;
+
+public partial class AppShell : Shell
+{
+ public AppShell()
+ {
+ InitializeComponent();
+ }
+}
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/GameCell.cs b/8.0/Apps/GameOfLife/GameOfLife/GameCell.cs
new file mode 100644
index 000000000..ba3a9b9c9
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/GameCell.cs
@@ -0,0 +1,39 @@
+namespace GameOfLife
+{
+ class GameCell : BoxView
+ {
+ public int Row { get; set; }
+ public int Col { get; set; }
+
+ bool isAlive;
+ public bool IsAlive
+ {
+ get
+ {
+ return isAlive;
+ }
+ set
+ {
+ if (isAlive != value)
+ {
+ isAlive = value;
+ BackgroundColor = isAlive ? Colors.Black : Colors.White;
+ }
+ }
+ }
+
+ public event EventHandler Tapped;
+
+ public GameCell()
+ {
+ BackgroundColor = Colors.White;
+
+ TapGestureRecognizer tapGesture = new TapGestureRecognizer();
+ tapGesture.Tapped += (sender, args) =>
+ {
+ Tapped?.Invoke(this, EventArgs.Empty);
+ };
+ GestureRecognizers.Add(tapGesture);
+ }
+ }
+}
diff --git a/8.0/Apps/GameOfLife/GameOfLife/GameGrid.cs b/8.0/Apps/GameOfLife/GameOfLife/GameGrid.cs
new file mode 100644
index 000000000..c39cb8137
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/GameGrid.cs
@@ -0,0 +1,140 @@
+namespace GameOfLife
+{
+ class GameGrid
+ {
+ // Change to true for grid-wrapping logic
+ const bool Wrap = false;
+
+ // Internal structure for encapsulting integer cell coordinates
+ // Keep this a structure for automatic equality comparison!
+ struct Coordinate
+ {
+ public int X { get; private set; }
+ public int Y { get; private set; }
+
+ public Coordinate(int x, int y)
+ {
+ X = x;
+ Y = y;
+ }
+ }
+
+ // The current population is stored in two ways, both of which are valid and consistent after every method call.
+
+ // This is a List of the coordinates of living cells:
+ List coordinates = new List();
+
+ // This is an array for for performing the Tick algorithm efficiently:
+ int cols = 10;
+ int rows = 10;
+ bool[,] grid = new bool[10, 10];
+
+ public void SetSize(int cols, int rows)
+ {
+ if (cols <= 0 || rows <= 0)
+ throw new ArgumentException("GameGrid.SetSize: Arguments must be greater than zero");
+
+ // If !Wrap, remove items from coordinates if X or Y greater than new cols and rows
+ if (!Wrap)
+ {
+ List removeList = new List();
+ foreach (Coordinate coordinate in coordinates)
+ {
+ if (coordinate.X < 0 || coordinate.X >= cols ||
+ coordinate.Y < 0 || coordinate.Y >= rows)
+ {
+ removeList.Add(coordinate);
+ }
+ }
+ foreach (Coordinate coordinate in removeList)
+ {
+ coordinates.Remove(coordinate);
+ }
+ }
+
+ this.cols = cols;
+ this.rows = rows;
+ CreateGridArray();
+ }
+
+ public void SetStatus(int x, int y, bool isAlive)
+ {
+ Coordinate coordinate = new Coordinate(x, y);
+
+ if (isAlive && !coordinates.Contains(coordinate))
+ coordinates.Add(coordinate);
+ if (!isAlive && coordinates.Contains(coordinate))
+ coordinates.Remove(coordinate);
+
+ CreateGridArray();
+ }
+
+ public bool IsAlive(int x, int y)
+ {
+ return grid[x, y];
+ }
+
+ public void Clear()
+ {
+ coordinates.Clear();
+ CreateGridArray();
+ }
+
+ public bool Tick()
+ {
+ coordinates.Clear();
+
+ if (grid == null)
+ return false;
+
+ for (int x = 0; x < cols; x++)
+ {
+ for (int y = 0; y < rows; y++)
+ {
+ int count = 0;
+
+ for (int xi = x - 1; xi <= x + 1; xi++)
+ for (int yi = y - 1; yi <= y + 1; yi++)
+ {
+ if (Wrap)
+ {
+ count += grid[(xi + cols) % cols, (yi + rows) % rows] ? 1 : 0;
+ }
+ else
+ {
+ if (xi >= 0 && yi >= 0 && xi < cols && yi < rows)
+ {
+ count += grid[xi, yi] ? 1 : 0;
+ }
+ }
+ }
+
+ if (count == 3 || (count == 4 && grid[x, y]))
+ {
+ // Modulo arithmetic is necessary when Wrap is true
+ coordinates.Add(new Coordinate(x % cols, y % rows));
+ }
+ }
+ }
+
+ CreateGridArray();
+ return coordinates.Count > 0;
+ }
+
+ void CreateGridArray()
+ {
+ if (rows <= 0 || cols <= 0)
+ {
+ grid = null;
+ return;
+ }
+
+ grid = new bool[cols, rows];
+ foreach (Coordinate coordinate in coordinates)
+ {
+ // Modulo arithmetic is necessary when Wrap is true
+ grid[coordinate.X % cols, coordinate.Y % rows] = true;
+ }
+ }
+ }
+}
diff --git a/8.0/Apps/GameOfLife/GameOfLife/GameOfLife.csproj b/8.0/Apps/GameOfLife/GameOfLife/GameOfLife.csproj
new file mode 100644
index 000000000..47863a098
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/GameOfLife.csproj
@@ -0,0 +1,65 @@
+
+
+
+ net8.0-android;net8.0-ios;net8.0-maccatalyst
+ $(TargetFrameworks);net8.0-windows10.0.19041.0
+
+
+
+
+
+
+ Exe
+ GameOfLife
+ true
+ true
+ enable
+ enable
+
+
+ GameOfLife
+
+
+ com.companyname.gameoflife
+
+
+ 1.0
+ 1
+
+ 11.0
+ 13.1
+ 21.0
+ 10.0.17763.0
+ 10.0.17763.0
+ 6.5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/MainPage.xaml b/8.0/Apps/GameOfLife/GameOfLife/MainPage.xaml
new file mode 100644
index 000000000..0725d8caf
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/MainPage.xaml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/MainPage.xaml.cs b/8.0/Apps/GameOfLife/GameOfLife/MainPage.xaml.cs
new file mode 100644
index 000000000..0e73b8b3f
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/MainPage.xaml.cs
@@ -0,0 +1,153 @@
+namespace GameOfLife;
+
+public partial class MainPage : ContentPage
+{
+ const int MaxCellSize = 30; // includes cell spacing
+ const int CellSpacing = 2;
+
+ // Generating too many BoxView elements can impact performance,
+ // particularly on iOS devices.
+ const int MaxCellCount = 400;
+
+ // Calculated during SizeChanged event
+ int cols;
+ int rows;
+ int cellSize;
+ int xMargin;
+ int yMargin;
+
+ GameGrid gameGrid = new GameGrid();
+ bool isRunning;
+
+ public MainPage()
+ {
+ InitializeComponent();
+ }
+
+ void OnLayoutSizeChanged(object sender, EventArgs args)
+ {
+ Layout layout = sender as Layout;
+
+ cols = (int)Math.Round(layout.Width / MaxCellSize);
+ rows = (int)Math.Round(layout.Height / MaxCellSize);
+
+ if (cols * rows > MaxCellCount)
+ {
+ cellSize = (int)Math.Sqrt((layout.Width * layout.Height) / MaxCellCount);
+ cols = (int)(layout.Width / cellSize);
+ rows = (int)(layout.Height / cellSize);
+ }
+ else
+ cellSize = (int)Math.Min(layout.Width / cols, layout.Height / rows);
+
+ xMargin = (int)((layout.Width - cols * cellSize) / 2);
+ yMargin = (int)((layout.Height - rows * cellSize) / 2);
+
+ if (cols > 0 && rows > 0)
+ {
+ gameGrid.SetSize(cols, rows);
+ UpdateLayout();
+ UpdateLives();
+ }
+ }
+
+ void UpdateLayout()
+ {
+ int count = rows * cols;
+ System.Diagnostics.Debug.WriteLine("Count = " + count);
+
+ // Remove unneeded LifeCell children
+ while (absoluteLayout.Children.Count > count)
+ {
+ absoluteLayout.Children.RemoveAt(0);
+ }
+
+ // Possibly add more LifeCell children
+ while (absoluteLayout.Children.Count < count)
+ {
+ GameCell gameCell = new GameCell();
+ gameCell.Tapped += OnTapGestureTapped;
+ absoluteLayout.Children.Add(gameCell);
+ }
+
+ int index = 0;
+ for (int x = 0; x < cols; x++)
+ {
+ for (int y = 0; y < rows; y++)
+ {
+ GameCell gameCell = gameCell = (GameCell)absoluteLayout.Children[index];
+ gameCell.Col = x;
+ gameCell.Row = y;
+ gameCell.IsAlive = gameGrid.IsAlive(x, y);
+
+ Rect rect = new Rect(x * cellSize + xMargin + CellSpacing / 2,
+ y * cellSize + yMargin + CellSpacing / 2,
+ cellSize - CellSpacing,
+ cellSize - CellSpacing);
+
+ AbsoluteLayout.SetLayoutBounds(gameCell, rect);
+ index++;
+ }
+ }
+ }
+
+ void UpdateLives()
+ {
+ foreach (View view in absoluteLayout.Children)
+ {
+ GameCell gameCell = view as GameCell;
+ gameCell.IsAlive = gameGrid.IsAlive(gameCell.Col, gameCell.Row);
+ }
+ }
+
+ void OnTapGestureTapped(object sender, EventArgs args)
+ {
+ GameCell gameCell = (GameCell)sender;
+ gameCell.IsAlive ^= true;
+ gameGrid.SetStatus(gameCell.Col, gameCell.Row, gameCell.IsAlive);
+ }
+
+ void OnRunButtonClicked(object sender, EventArgs args)
+ {
+ if (!isRunning)
+ {
+ runButton.Text = "Pause";
+ isRunning = true;
+ clearButton.IsEnabled = false;
+ Dispatcher.StartTimer(TimeSpan.FromMilliseconds(250), OnTimerTick);
+ }
+ else
+ StopRunning();
+ }
+
+ void StopRunning()
+ {
+ isRunning = false;
+ runButton.Text = "Run!";
+ clearButton.IsEnabled = true;
+ }
+
+ bool OnTimerTick()
+ {
+ if (isRunning)
+ {
+ bool isLifeLeft = gameGrid.Tick();
+ UpdateLives();
+
+ if (!isLifeLeft)
+ StopRunning();
+ }
+ return isRunning;
+ }
+
+ void OnClearButtonClicked(object sender, EventArgs args)
+ {
+ gameGrid.Clear();
+ UpdateLives();
+ }
+
+ async void OnAboutButtonClicked(object sender, EventArgs args)
+ {
+ await Navigation.PushModalAsync(new AboutPage());
+ }
+}
\ No newline at end of file
diff --git a/8.0/Apps/GameOfLife/GameOfLife/MauiProgram.cs b/8.0/Apps/GameOfLife/GameOfLife/MauiProgram.cs
new file mode 100644
index 000000000..a5b4f0764
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/MauiProgram.cs
@@ -0,0 +1,25 @@
+using Microsoft.Extensions.Logging;
+
+namespace GameOfLife;
+
+public static class MauiProgram
+{
+ public static MauiApp CreateMauiApp()
+ {
+ var builder = MauiApp.CreateBuilder();
+ builder
+ .UseMauiApp()
+ .ConfigureFonts(fonts =>
+ {
+ fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
+ fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
+ });
+
+#if DEBUG
+ builder.Logging.AddDebug();
+#endif
+
+ return builder.Build();
+ }
+}
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/Platforms/Android/AndroidManifest.xml b/8.0/Apps/GameOfLife/GameOfLife/Platforms/Android/AndroidManifest.xml
new file mode 100644
index 000000000..ddd284fbc
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/Platforms/Android/AndroidManifest.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/Platforms/Android/MainActivity.cs b/8.0/Apps/GameOfLife/GameOfLife/Platforms/Android/MainActivity.cs
new file mode 100644
index 000000000..102ba226e
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/Platforms/Android/MainActivity.cs
@@ -0,0 +1,11 @@
+using Android.App;
+using Android.Content.PM;
+using Android.OS;
+
+namespace GameOfLife;
+
+[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
+public class MainActivity : MauiAppCompatActivity
+{
+}
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/Platforms/Android/MainApplication.cs b/8.0/Apps/GameOfLife/GameOfLife/Platforms/Android/MainApplication.cs
new file mode 100644
index 000000000..49b2e7159
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/Platforms/Android/MainApplication.cs
@@ -0,0 +1,16 @@
+using Android.App;
+using Android.Runtime;
+
+namespace GameOfLife;
+
+[Application]
+public class MainApplication : MauiApplication
+{
+ public MainApplication(IntPtr handle, JniHandleOwnership ownership)
+ : base(handle, ownership)
+ {
+ }
+
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+}
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/Platforms/Android/Resources/values/colors.xml b/8.0/Apps/GameOfLife/GameOfLife/Platforms/Android/Resources/values/colors.xml
new file mode 100644
index 000000000..3b8595ecd
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/Platforms/Android/Resources/values/colors.xml
@@ -0,0 +1,6 @@
+
+
+ #512BD4
+ #2B0B98
+ #2B0B98
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/Platforms/MacCatalyst/AppDelegate.cs b/8.0/Apps/GameOfLife/GameOfLife/Platforms/MacCatalyst/AppDelegate.cs
new file mode 100644
index 000000000..c5cccf16d
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/Platforms/MacCatalyst/AppDelegate.cs
@@ -0,0 +1,10 @@
+using Foundation;
+
+namespace GameOfLife;
+
+[Register("AppDelegate")]
+public class AppDelegate : MauiUIApplicationDelegate
+{
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+}
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/Platforms/MacCatalyst/Entitlements.plist b/8.0/Apps/GameOfLife/GameOfLife/Platforms/MacCatalyst/Entitlements.plist
new file mode 100644
index 000000000..8e87c0cb0
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/Platforms/MacCatalyst/Entitlements.plist
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+ com.apple.security.app-sandbox
+
+
+ com.apple.security.network.client
+
+
+
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/Platforms/MacCatalyst/Info.plist b/8.0/Apps/GameOfLife/GameOfLife/Platforms/MacCatalyst/Info.plist
new file mode 100644
index 000000000..f24aacc0d
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/Platforms/MacCatalyst/Info.plist
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ UIDeviceFamily
+
+ 2
+
+ UIRequiredDeviceCapabilities
+
+ arm64
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ XSAppIconAssets
+ Assets.xcassets/appicon.appiconset
+
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/Platforms/MacCatalyst/Program.cs b/8.0/Apps/GameOfLife/GameOfLife/Platforms/MacCatalyst/Program.cs
new file mode 100644
index 000000000..c46958bee
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/Platforms/MacCatalyst/Program.cs
@@ -0,0 +1,16 @@
+using ObjCRuntime;
+using UIKit;
+
+namespace GameOfLife;
+
+public class Program
+{
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, typeof(AppDelegate));
+ }
+}
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/Platforms/Tizen/Main.cs b/8.0/Apps/GameOfLife/GameOfLife/Platforms/Tizen/Main.cs
new file mode 100644
index 000000000..49044b1cd
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/Platforms/Tizen/Main.cs
@@ -0,0 +1,17 @@
+using System;
+using Microsoft.Maui;
+using Microsoft.Maui.Hosting;
+
+namespace GameOfLife;
+
+class Program : MauiApplication
+{
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+
+ static void Main(string[] args)
+ {
+ var app = new Program();
+ app.Run(args);
+ }
+}
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/Platforms/Tizen/tizen-manifest.xml b/8.0/Apps/GameOfLife/GameOfLife/Platforms/Tizen/tizen-manifest.xml
new file mode 100644
index 000000000..a50fe3fc5
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/Platforms/Tizen/tizen-manifest.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+ maui-appicon-placeholder
+
+
+
+
+ http://tizen.org/privilege/internet
+
+
+
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/Platforms/Windows/App.xaml b/8.0/Apps/GameOfLife/GameOfLife/Platforms/Windows/App.xaml
new file mode 100644
index 000000000..b20a13957
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/Platforms/Windows/App.xaml
@@ -0,0 +1,9 @@
+
+
+
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/Platforms/Windows/App.xaml.cs b/8.0/Apps/GameOfLife/GameOfLife/Platforms/Windows/App.xaml.cs
new file mode 100644
index 000000000..47d8653db
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/Platforms/Windows/App.xaml.cs
@@ -0,0 +1,25 @@
+using Microsoft.UI.Xaml;
+
+// To learn more about WinUI, the WinUI project structure,
+// and more about our project templates, see: http://aka.ms/winui-project-info.
+
+namespace GameOfLife.WinUI;
+
+///
+/// Provides application-specific behavior to supplement the default Application class.
+///
+public partial class App : MauiWinUIApplication
+{
+ ///
+ /// Initializes the singleton application object. This is the first line of authored code
+ /// executed, and as such is the logical equivalent of main() or WinMain().
+ ///
+ public App()
+ {
+ this.InitializeComponent();
+ }
+
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+}
+
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/Platforms/Windows/Package.appxmanifest b/8.0/Apps/GameOfLife/GameOfLife/Platforms/Windows/Package.appxmanifest
new file mode 100644
index 000000000..8914be724
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/Platforms/Windows/Package.appxmanifest
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+ $placeholder$
+ User Name
+ $placeholder$.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/Platforms/Windows/app.manifest b/8.0/Apps/GameOfLife/GameOfLife/Platforms/Windows/app.manifest
new file mode 100644
index 000000000..1a2c6c97d
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/Platforms/Windows/app.manifest
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+ true/PM
+ PerMonitorV2, PerMonitor
+
+
+
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/Platforms/iOS/AppDelegate.cs b/8.0/Apps/GameOfLife/GameOfLife/Platforms/iOS/AppDelegate.cs
new file mode 100644
index 000000000..c5cccf16d
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/Platforms/iOS/AppDelegate.cs
@@ -0,0 +1,10 @@
+using Foundation;
+
+namespace GameOfLife;
+
+[Register("AppDelegate")]
+public class AppDelegate : MauiUIApplicationDelegate
+{
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+}
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/Platforms/iOS/Info.plist b/8.0/Apps/GameOfLife/GameOfLife/Platforms/iOS/Info.plist
new file mode 100644
index 000000000..358337bbd
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/Platforms/iOS/Info.plist
@@ -0,0 +1,32 @@
+
+
+
+
+ LSRequiresIPhoneOS
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UIRequiredDeviceCapabilities
+
+ arm64
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ XSAppIconAssets
+ Assets.xcassets/appicon.appiconset
+
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/Platforms/iOS/Program.cs b/8.0/Apps/GameOfLife/GameOfLife/Platforms/iOS/Program.cs
new file mode 100644
index 000000000..c46958bee
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/Platforms/iOS/Program.cs
@@ -0,0 +1,16 @@
+using ObjCRuntime;
+using UIKit;
+
+namespace GameOfLife;
+
+public class Program
+{
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, typeof(AppDelegate));
+ }
+}
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/Properties/launchSettings.json b/8.0/Apps/GameOfLife/GameOfLife/Properties/launchSettings.json
new file mode 100644
index 000000000..90f92d965
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/Properties/launchSettings.json
@@ -0,0 +1,8 @@
+{
+ "profiles": {
+ "Windows Machine": {
+ "commandName": "MsixPackage",
+ "nativeDebugging": false
+ }
+ }
+}
diff --git a/8.0/Apps/GameOfLife/GameOfLife/Resources/AppIcon/appicon.svg b/8.0/Apps/GameOfLife/GameOfLife/Resources/AppIcon/appicon.svg
new file mode 100644
index 000000000..49f980057
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/Resources/AppIcon/appicon.svg
@@ -0,0 +1,5 @@
+
+
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/Resources/AppIcon/appiconfg.svg b/8.0/Apps/GameOfLife/GameOfLife/Resources/AppIcon/appiconfg.svg
new file mode 100644
index 000000000..e9b7139de
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/Resources/AppIcon/appiconfg.svg
@@ -0,0 +1,8 @@
+
+
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/Resources/Fonts/OpenSans-Regular.ttf b/8.0/Apps/GameOfLife/GameOfLife/Resources/Fonts/OpenSans-Regular.ttf
new file mode 100644
index 000000000..04a336a52
Binary files /dev/null and b/8.0/Apps/GameOfLife/GameOfLife/Resources/Fonts/OpenSans-Regular.ttf differ
diff --git a/8.0/Apps/GameOfLife/GameOfLife/Resources/Fonts/OpenSans-Semibold.ttf b/8.0/Apps/GameOfLife/GameOfLife/Resources/Fonts/OpenSans-Semibold.ttf
new file mode 100644
index 000000000..1df30e6c0
Binary files /dev/null and b/8.0/Apps/GameOfLife/GameOfLife/Resources/Fonts/OpenSans-Semibold.ttf differ
diff --git a/8.0/Apps/GameOfLife/GameOfLife/Resources/Images/dotnet_bot.svg b/8.0/Apps/GameOfLife/GameOfLife/Resources/Images/dotnet_bot.svg
new file mode 100644
index 000000000..e19b01271
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/Resources/Images/dotnet_bot.svg
@@ -0,0 +1,95 @@
+
+
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/Resources/Raw/AboutAssets.txt b/8.0/Apps/GameOfLife/GameOfLife/Resources/Raw/AboutAssets.txt
new file mode 100644
index 000000000..29b76b2ea
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/Resources/Raw/AboutAssets.txt
@@ -0,0 +1,18 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories). Deployment of the asset to your application
+is automatically handled by the following `MauiAsset` Build Action within your `.csproj`.
+
+
+
+These files will be deployed with you package and will be accessible using Essentials:
+
+ async Task LoadMauiAsset()
+ {
+ using var stream = await FileSystem.OpenAppPackageFileAsync("AboutAssets.txt");
+ using var reader = new StreamReader(stream);
+
+ var contents = reader.ReadToEnd();
+ }
+
+
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/Resources/Splash/splash.svg b/8.0/Apps/GameOfLife/GameOfLife/Resources/Splash/splash.svg
new file mode 100644
index 000000000..4b713836f
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/Resources/Splash/splash.svg
@@ -0,0 +1,9 @@
+
+
+
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/Resources/Styles/Colors.xaml b/8.0/Apps/GameOfLife/GameOfLife/Resources/Styles/Colors.xaml
new file mode 100644
index 000000000..66867878f
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/Resources/Styles/Colors.xaml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+ #512BD4
+ #DFD8F7
+ #2B0B98
+ White
+ Black
+ #E1E1E1
+ #C8C8C8
+ #ACACAC
+ #919191
+ #6E6E6E
+ #404040
+ #212121
+ #141414
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #F7B548
+ #FFD590
+ #FFE5B9
+ #28C2D1
+ #7BDDEF
+ #C3F2F4
+ #3E8EED
+ #72ACF1
+ #A7CBF6
+
+
+
diff --git a/8.0/Apps/GameOfLife/GameOfLife/Resources/Styles/Styles.xaml b/8.0/Apps/GameOfLife/GameOfLife/Resources/Styles/Styles.xaml
new file mode 100644
index 000000000..d45ca5bad
--- /dev/null
+++ b/8.0/Apps/GameOfLife/GameOfLife/Resources/Styles/Styles.xaml
@@ -0,0 +1,409 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/8.0/Apps/GameOfLife/README.md b/8.0/Apps/GameOfLife/README.md
new file mode 100644
index 000000000..5df8dec34
--- /dev/null
+++ b/8.0/Apps/GameOfLife/README.md
@@ -0,0 +1,21 @@
+---
+name: .NET MAUI - Game of Life
+description: This is an implementation of the Game of Life for .NET MAUI. Life is a cellular automaton invented by mathematician John Conway in 1970.
+page_type: sample
+languages:
+- csharp
+- xaml
+products:
+- dotnet-maui
+urlFragment: apps-gameoflife
+---
+
+# Game of Life
+
+This is an implementation of the Game of Life for .NET Multi-platform App UI (.NET MAUI). Life is a cellular automaton invented by mathematician John Conway in 1970 and popularized in *Scientfic American*.
+
+Tap cells to make them "alive" A clustered population of live cells works the best. Then press the **Run!** button. Rules are applied to the live cells to generate successive populations. A population might grow, or shrink, or stagnate, or disappear.
+
+![Game of Life app screenshot](Screenshots/GameofLife.png "Game of Life appl screenshot")
+
+For more information about the Game of Life, see the Wikipedia article [Conway's Game of Life](https://en.wikipedia.org/wiki/Conway's_Game_of_Life).
diff --git a/8.0/Apps/GameOfLife/Screenshots/GameofLife.png b/8.0/Apps/GameOfLife/Screenshots/GameofLife.png
new file mode 100644
index 000000000..7ae7cb2b8
Binary files /dev/null and b/8.0/Apps/GameOfLife/Screenshots/GameofLife.png differ