diff --git a/RedBookPlayer.GUI/MainWindow.xaml.cs b/RedBookPlayer.GUI/MainWindow.xaml.cs
index a04d83f..094c53e 100644
--- a/RedBookPlayer.GUI/MainWindow.xaml.cs
+++ b/RedBookPlayer.GUI/MainWindow.xaml.cs
@@ -5,6 +5,7 @@ using System.Xml;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Markup.Xaml;
+using RedBookPlayer.Common;
namespace RedBookPlayer.GUI
{
@@ -30,10 +31,13 @@ namespace RedBookPlayer.GUI
if(string.IsNullOrWhiteSpace(theme))
return;
+ // If we already have a view, cache the view model
+ PlayerViewModel pvm = ((PlayerView)Instance.ContentControl.Content).PlayerViewModel;
+
// If the theme name is "default", we assume the internal theme is used
if(theme.Equals("default", StringComparison.CurrentCultureIgnoreCase))
{
- Instance.ContentControl.Content = new PlayerView();
+ Instance.ContentControl.Content = new PlayerView(pvm);
}
else
{
@@ -50,12 +54,12 @@ namespace RedBookPlayer.GUI
{
string xaml = File.ReadAllText(xamlPath);
xaml = xaml.Replace("Source=\"", $"Source=\"file://{themeDirectory}/");
- Instance.ContentControl.Content = new PlayerView(xaml);
+ Instance.ContentControl.Content = new PlayerView(xaml, pvm);
}
catch(XmlException ex)
{
Console.WriteLine($"Error: invalid theme XAML ({ex.Message}), reverting to default");
- Instance.ContentControl.Content = new PlayerView();
+ Instance.ContentControl.Content = new PlayerView(pvm);
}
}
diff --git a/RedBookPlayer.GUI/PlayerView.xaml.cs b/RedBookPlayer.GUI/PlayerView.xaml.cs
index 16f43cc..6696fd0 100644
--- a/RedBookPlayer.GUI/PlayerView.xaml.cs
+++ b/RedBookPlayer.GUI/PlayerView.xaml.cs
@@ -30,15 +30,27 @@ namespace RedBookPlayer.GUI
///
/// Initialize the UI based on the default theme
///
- public PlayerView() : this(null) { }
+ public PlayerView() : this(null, null) { }
+
+ ///
+ /// Initialize the UI based on the default theme with an existing view model
+ ///
+ /// XAML data representing the theme, null for default
+ /// Existing PlayerViewModel to load in instead of creating a new one
+ public PlayerView(PlayerViewModel playerViewModel) : this(null, playerViewModel) { }
///
/// Initialize the UI based on the currently selected theme
///
/// XAML data representing the theme, null for default
- public PlayerView(string xaml)
+ /// Existing PlayerViewModel to load in instead of creating a new one
+ public PlayerView(string xaml, PlayerViewModel playerViewModel)
{
- DataContext = new PlayerViewModel();
+ if(playerViewModel != null)
+ DataContext = playerViewModel;
+ else
+ DataContext = new PlayerViewModel();
+
PlayerViewModel.PropertyChanged += PlayerViewModelStateChanged;
LoadTheme(xaml);