From eab730c1f2f63be033be935851c7ea82021f3812 Mon Sep 17 00:00:00 2001
From: Joseph Moreno <44370115+josephmoresena@users.noreply.github.com>
Date: Mon, 13 Dec 2021 16:17:55 -0500
Subject: [PATCH] Sample improves
* No remove axaml files for makes the sample simpler.
* Creation of utilities class.
* Avoid using ref Bitmap on MainViewModel.
* Avoid application crashing when dotnet.png or avalonia.png are missing. Using an replace embeded image instead.
* Conditionally invoke of UseAvaloniaNative at runtime.
---
src/App.axaml.cs | 8 +---
src/AvaloniaCoreRTDemo.csproj | 4 --
src/Controls/ViewModels/MainViewModel.cs | 26 ++++++-------
src/Images/broken-link.png | Bin 0 -> 15464 bytes
src/Program.cs | 12 +++---
src/Utilities.cs | 39 ++++++++++++++++++++
src/Windows/ViewModels/AboutViewModel.cs | 26 +++----------
src/Windows/ViewModels/MainViewModel.cs | 2 +-
src/Windows/ViewModels/MainViewModelBase.cs | 6 +--
9 files changed, 69 insertions(+), 54 deletions(-)
create mode 100644 src/Images/broken-link.png
create mode 100644 src/Utilities.cs
diff --git a/src/App.axaml.cs b/src/App.axaml.cs
index 42529d0..e05cb41 100644
--- a/src/App.axaml.cs
+++ b/src/App.axaml.cs
@@ -1,3 +1,4 @@
+
using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Markup.Xaml;
@@ -30,12 +31,7 @@ namespace AvaloniaCoreRTDemo
this.InitializeThemes();
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
- desktop.MainWindow =
-#if !OSX
- new MainWindow();
-#else
- new MainWindowMacOS();
-#endif
+ desktop.MainWindow = !Utilities.IsOSX ? new MainWindow() : new MainWindowMacOS();
this.DataContext = desktop.MainWindow.DataContext;
}
base.OnFrameworkInitializationCompleted();
diff --git a/src/AvaloniaCoreRTDemo.csproj b/src/AvaloniaCoreRTDemo.csproj
index 73edcee..7e20a93 100644
--- a/src/AvaloniaCoreRTDemo.csproj
+++ b/src/AvaloniaCoreRTDemo.csproj
@@ -99,15 +99,11 @@
MainWindow.axaml
-
-
MainWindowMacOS.axaml
-
-
\ No newline at end of file
diff --git a/src/Controls/ViewModels/MainViewModel.cs b/src/Controls/ViewModels/MainViewModel.cs
index ee69584..29fc9f4 100644
--- a/src/Controls/ViewModels/MainViewModel.cs
+++ b/src/Controls/ViewModels/MainViewModel.cs
@@ -1,6 +1,5 @@
using System;
using System.IO;
-using System.Runtime.CompilerServices;
using Avalonia.Media.Imaging;
@@ -13,22 +12,23 @@ namespace AvaloniaCoreRTDemo.Controls.ViewModels
private readonly IBitmap _dotNetImage;
private readonly IBitmap _avaloniaImage;
- public IBitmap DotNetImage
- {
- get { return _dotNetImage; }
- set { this.RaiseAndSetIfChanged(ref Unsafe.AsRef(this._dotNetImage), value); }
- }
+ public IBitmap DotNetImage => this._dotNetImage;
- public IBitmap AvaloniaImage
- {
- get { return _avaloniaImage; }
- set { this.RaiseAndSetIfChanged(ref Unsafe.AsRef(this._avaloniaImage), value); }
- }
+ public IBitmap AvaloniaImage => this._avaloniaImage;
public MainViewModel()
{
- this._dotNetImage = new Bitmap(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "dotnet.png"));
- this._avaloniaImage = new Bitmap(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "avalonia.png"));
+ this._dotNetImage = Utilities.GetImageFromFile(GetImageFullPath("dotnet.png"));
+ this._avaloniaImage = Utilities.GetImageFromFile(GetImageFullPath("avalonia.png"));
+ }
+
+ private static String GetImageFullPath(String fileName)
+ => Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileName);
+
+ ~MainViewModel()
+ {
+ this._dotNetImage.Dispose();
+ this._avaloniaImage.Dispose();
}
}
}
diff --git a/src/Images/broken-link.png b/src/Images/broken-link.png
new file mode 100644
index 0000000000000000000000000000000000000000..585ee1c69da73bde6f11a4b633229295b562fe7e
GIT binary patch
literal 15464
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
eT35vr1^ypBP2?iy5Uwr&0000 AppBuilder.Configure().UsePlatformDetect()
-#if OSX
- .UseAvaloniaNative()
-#endif
+ .UseAvaloniaNativeOSX()
.LogToTrace();
+
+ private static AppBuilder UseAvaloniaNativeOSX(this AppBuilder appBuilder)
+ => Utilities.IsOSX ? appBuilder.UseAvaloniaNative() : appBuilder;
}
}
diff --git a/src/Utilities.cs b/src/Utilities.cs
new file mode 100644
index 0000000..4296e91
--- /dev/null
+++ b/src/Utilities.cs
@@ -0,0 +1,39 @@
+using System;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+using Avalonia.Media.Imaging;
+
+namespace AvaloniaCoreRTDemo
+{
+ internal static class Utilities
+ {
+ public static readonly Boolean IsWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
+ public static readonly Boolean IsOSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX);
+
+ public static Bitmap GetImageFromResources(String fileName)
+ {
+ Assembly asm = Assembly.GetExecutingAssembly();
+ String resourceName = asm.GetManifestResourceNames().FirstOrDefault(str => str.EndsWith(fileName));
+ if (resourceName != null)
+ using (Stream bitmapStream = asm.GetManifestResourceStream(resourceName))
+ return new Bitmap(bitmapStream);
+ else
+ return default;
+ }
+
+ public static Bitmap GetImageFromFile(String path)
+ {
+ try
+ {
+ return new Bitmap(path);
+ }
+ catch (Exception)
+ {
+ return GetImageFromResources("broken-link.png");
+ }
+ }
+ }
+}
diff --git a/src/Windows/ViewModels/AboutViewModel.cs b/src/Windows/ViewModels/AboutViewModel.cs
index ee4b0a9..b09161e 100644
--- a/src/Windows/ViewModels/AboutViewModel.cs
+++ b/src/Windows/ViewModels/AboutViewModel.cs
@@ -1,7 +1,4 @@
using System;
-using System.IO;
-using System.Linq;
-using System.Reflection;
using System.Runtime.InteropServices;
using Avalonia.Media.Imaging;
@@ -34,35 +31,24 @@ namespace AvaloniaCoreRTDemo.Windows.ViewModels
{
get
{
- if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
- return !_darkTheme ? "windows.png" : "windows_d.png";
- else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
- return !_darkTheme ? "macos.png" : "macos_d.png";
+ if (Utilities.IsWindows)
+ return !this._darkTheme ? "windows.png" : "windows_d.png";
+ else if (Utilities.IsOSX)
+ return !this._darkTheme ? "macos.png" : "macos_d.png";
else
- return !_darkTheme ? "linux.png" : "linux_d.png";
+ return !this._darkTheme ? "linux.png" : "linux_d.png";
}
}
public AboutViewModel(Boolean darkTheme)
{
this._darkTheme = darkTheme;
- this._computerImage = GetImageFromResources(this.ComputerImageName);
+ this._computerImage = Utilities.GetImageFromResources(this.ComputerImageName);
}
~AboutViewModel()
{
this._computerImage.Dispose();
}
-
- private static Bitmap GetImageFromResources(String fileName)
- {
- Assembly asm = Assembly.GetExecutingAssembly();
- String resourceName = asm.GetManifestResourceNames().FirstOrDefault(str => str.EndsWith(fileName));
- if (resourceName != null)
- using (Stream bitmapStream = asm.GetManifestResourceStream(resourceName))
- return new Bitmap(bitmapStream);
- else
- return default;
- }
}
}
diff --git a/src/Windows/ViewModels/MainViewModel.cs b/src/Windows/ViewModels/MainViewModel.cs
index 1a72964..a0acc74 100644
--- a/src/Windows/ViewModels/MainViewModel.cs
+++ b/src/Windows/ViewModels/MainViewModel.cs
@@ -55,7 +55,7 @@ namespace AvaloniaCoreRTDemo.Windows.ViewModels
public void DefaultDarkMethod() => this.ChangeTheme(ApplicationTheme.DefaultDark);
public void FluentLightMethod() => this.ChangeTheme(ApplicationTheme.FluentLight);
public void FluentDarkMethod() => this.ChangeTheme(ApplicationTheme.FluentDark);
- public void HelpAboutMethod() => base.RunHelpAbout(this._window);
+ public override void HelpAboutMethod() => base.RunHelpAbout(this._window);
private void RunFileExit()
=> Environment.Exit(0);
diff --git a/src/Windows/ViewModels/MainViewModelBase.cs b/src/Windows/ViewModels/MainViewModelBase.cs
index 9c9f2c6..c7faffd 100644
--- a/src/Windows/ViewModels/MainViewModelBase.cs
+++ b/src/Windows/ViewModels/MainViewModelBase.cs
@@ -1,8 +1,4 @@
using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
using Avalonia.Controls;
@@ -26,6 +22,8 @@ namespace AvaloniaCoreRTDemo.Windows.ViewModels
public MainViewModelBase(IThemeSwitch window)
=> this._themeSwitch = window;
+ public abstract void HelpAboutMethod();
+
protected async void RunHelpAbout(Window currentWindow)
{
if (this.AboutEnabled)