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 0000000..585ee1c
Binary files /dev/null and b/src/Images/broken-link.png differ
diff --git a/src/Program.cs b/src/Program.cs
index 0bde694..8478e3c 100644
--- a/src/Program.cs
+++ b/src/Program.cs
@@ -1,9 +1,8 @@
-
-using Avalonia;
+using Avalonia;
namespace AvaloniaCoreRTDemo
{
- class Program
+ public static class Program
{
// Initialization code. Don't use any Avalonia, third-party APIs or any
// SynchronizationContext-reliant code before AppMain is called: things aren't initialized
@@ -13,9 +12,10 @@ namespace AvaloniaCoreRTDemo
// Avalonia configuration, don't remove; also used by visual designer.
public static AppBuilder BuildAvaloniaApp()
=> 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)