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);