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)