Fix setting window navigation update issue & Check view model null instead of IsInitialized flag

This commit is contained in:
Jack251970 2025-05-15 18:35:57 +08:00
parent c591011908
commit 57dccce1bf
14 changed files with 100 additions and 15 deletions

View file

@ -14,7 +14,7 @@ namespace Flow.Launcher.Resources.Pages
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (!IsInitialized)
if (_viewModel == null)
{
Settings = Ioc.Default.GetRequiredService<Settings>();
_viewModel = Ioc.Default.GetRequiredService<WelcomeViewModel>();

View file

@ -16,7 +16,7 @@ namespace Flow.Launcher.Resources.Pages
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (!IsInitialized)
if (_viewModel == null)
{
Settings = Ioc.Default.GetRequiredService<Settings>();
_viewModel = Ioc.Default.GetRequiredService<WelcomeViewModel>();

View file

@ -12,7 +12,7 @@ namespace Flow.Launcher.Resources.Pages
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (!IsInitialized)
if (_viewModel == null)
{
Settings = Ioc.Default.GetRequiredService<Settings>();
_viewModel = Ioc.Default.GetRequiredService<WelcomeViewModel>();

View file

@ -12,7 +12,7 @@ namespace Flow.Launcher.Resources.Pages
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (!IsInitialized)
if (_viewModel == null)
{
Settings = Ioc.Default.GetRequiredService<Settings>();
_viewModel = Ioc.Default.GetRequiredService<WelcomeViewModel>();

View file

@ -15,7 +15,7 @@ namespace Flow.Launcher.Resources.Pages
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (!IsInitialized)
if (_viewModel == null)
{
Settings = Ioc.Default.GetRequiredService<Settings>();
_viewModel = Ioc.Default.GetRequiredService<WelcomeViewModel>();

View file

@ -1,21 +1,27 @@
using System.Windows.Navigation;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.SettingPages.ViewModels;
using Flow.Launcher.ViewModel;
namespace Flow.Launcher.SettingPages.Views;
public partial class SettingsPaneAbout
{
private SettingsPaneAboutViewModel _viewModel = null!;
private SettingWindowViewModel _settingViewModel = null;
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (!IsInitialized)
if (_viewModel == null)
{
_viewModel = Ioc.Default.GetRequiredService<SettingsPaneAboutViewModel>();
_settingViewModel = Ioc.Default.GetRequiredService<SettingWindowViewModel>();
DataContext = _viewModel;
InitializeComponent();
}
// Sometimes the navigation is not triggered by button click,
// so we need to reset the page type
_settingViewModel.PageType = typeof(SettingsPaneAbout);
base.OnNavigatedTo(e);
}

View file

@ -1,21 +1,27 @@
using System.Windows.Navigation;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.SettingPages.ViewModels;
using Flow.Launcher.ViewModel;
namespace Flow.Launcher.SettingPages.Views;
public partial class SettingsPaneGeneral
{
private SettingsPaneGeneralViewModel _viewModel = null!;
private SettingWindowViewModel _settingViewModel = null;
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (!IsInitialized)
if (_viewModel == null)
{
_viewModel = Ioc.Default.GetRequiredService<SettingsPaneGeneralViewModel>();
_settingViewModel = Ioc.Default.GetRequiredService<SettingWindowViewModel>();
DataContext = _viewModel;
InitializeComponent();
}
// Sometimes the navigation is not triggered by button click,
// so we need to reset the page type
_settingViewModel.PageType = typeof(SettingsPaneGeneral);
base.OnNavigatedTo(e);
}
}

View file

@ -1,21 +1,27 @@
using System.Windows.Navigation;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.SettingPages.ViewModels;
using Flow.Launcher.ViewModel;
namespace Flow.Launcher.SettingPages.Views;
public partial class SettingsPaneHotkey
{
private SettingsPaneHotkeyViewModel _viewModel = null!;
private SettingWindowViewModel _settingViewModel = null;
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (!IsInitialized)
if (_viewModel == null)
{
_viewModel = Ioc.Default.GetRequiredService<SettingsPaneHotkeyViewModel>();
_settingViewModel = Ioc.Default.GetRequiredService<SettingWindowViewModel>();
DataContext = _viewModel;
InitializeComponent();
}
// Sometimes the navigation is not triggered by button click,
// so we need to reset the page type
_settingViewModel.PageType = typeof(SettingsPaneHotkey);
base.OnNavigatedTo(e);
}
}

View file

@ -11,16 +11,21 @@ namespace Flow.Launcher.SettingPages.Views;
public partial class SettingsPanePluginStore
{
private SettingsPanePluginStoreViewModel _viewModel = null!;
private SettingWindowViewModel _settingViewModel = null;
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (!IsInitialized)
if (_viewModel == null)
{
_viewModel = Ioc.Default.GetRequiredService<SettingsPanePluginStoreViewModel>();
_settingViewModel = Ioc.Default.GetRequiredService<SettingWindowViewModel>();
DataContext = _viewModel;
InitializeComponent();
}
_viewModel.PropertyChanged += ViewModel_PropertyChanged;
// Sometimes the navigation is not triggered by button click,
// so we need to reset the page type
_settingViewModel.PageType = typeof(SettingsPanePluginStore);
base.OnNavigatedTo(e);
}

View file

@ -11,16 +11,21 @@ namespace Flow.Launcher.SettingPages.Views;
public partial class SettingsPanePlugins
{
private SettingsPanePluginsViewModel _viewModel = null!;
private SettingWindowViewModel _settingViewModel = null;
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (!IsInitialized)
if (_viewModel == null)
{
_viewModel = Ioc.Default.GetRequiredService<SettingsPanePluginsViewModel>();
_settingViewModel = Ioc.Default.GetRequiredService<SettingWindowViewModel>();
DataContext = _viewModel;
InitializeComponent();
}
_viewModel.PropertyChanged += ViewModel_PropertyChanged;
// Sometimes the navigation is not triggered by button click,
// so we need to reset the page type
_settingViewModel.PageType = typeof(SettingsPanePlugins);
base.OnNavigatedTo(e);
}

View file

@ -1,21 +1,27 @@
using System.Windows.Navigation;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.SettingPages.ViewModels;
using Flow.Launcher.ViewModel;
namespace Flow.Launcher.SettingPages.Views;
public partial class SettingsPaneProxy
{
private SettingsPaneProxyViewModel _viewModel = null!;
private SettingWindowViewModel _settingViewModel = null;
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (!IsInitialized)
if (_viewModel == null)
{
_viewModel = Ioc.Default.GetRequiredService<SettingsPaneProxyViewModel>();
_settingViewModel = Ioc.Default.GetRequiredService<SettingWindowViewModel>();
DataContext = _viewModel;
InitializeComponent();
}
// Sometimes the navigation is not triggered by button click,
// so we need to reset the page type
_settingViewModel.PageType = typeof(SettingsPaneProxy);
base.OnNavigatedTo(e);
}
}

View file

@ -1,21 +1,27 @@
using System.Windows.Navigation;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.SettingPages.ViewModels;
using Flow.Launcher.ViewModel;
namespace Flow.Launcher.SettingPages.Views;
public partial class SettingsPaneTheme
{
private SettingsPaneThemeViewModel _viewModel = null!;
private SettingWindowViewModel _settingViewModel = null;
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (!IsInitialized)
if (_viewModel == null)
{
_viewModel = Ioc.Default.GetRequiredService<SettingsPaneThemeViewModel>();
_settingViewModel = Ioc.Default.GetRequiredService<SettingWindowViewModel>();
DataContext = _viewModel;
InitializeComponent();
}
// Sometimes the navigation is not triggered by button click,
// so we need to reset the page type
_settingViewModel.PageType = typeof(SettingsPaneTheme);
base.OnNavigatedTo(e);
}
}

View file

@ -1,4 +1,5 @@
using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
@ -18,6 +19,7 @@ public partial class SettingWindow
#region Private Fields
private readonly Settings _settings;
private readonly SettingWindowViewModel _viewModel;
#endregion
@ -26,8 +28,8 @@ public partial class SettingWindow
public SettingWindow()
{
_settings = Ioc.Default.GetRequiredService<Settings>();
var viewModel = Ioc.Default.GetRequiredService<SettingWindowViewModel>();
DataContext = viewModel;
_viewModel = Ioc.Default.GetRequiredService<SettingWindowViewModel>();
DataContext = _viewModel;
InitializeComponent();
UpdatePositionAndState();
@ -48,10 +50,37 @@ public partial class SettingWindow
hwndTarget.RenderMode = RenderMode.SoftwareOnly; // Must use software only render mode here
UpdatePositionAndState();
_viewModel.PropertyChanged += ViewModel_PropertyChanged;
}
// Sometimes the navigation is not triggered by button click,
// so we need to update the selected item here
private void ViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case nameof(SettingWindowViewModel.PageType):
var selectedIndex = _viewModel.PageType.Name switch
{
nameof(SettingsPaneGeneral) => 0,
nameof(SettingsPanePlugins) => 1,
nameof(SettingsPanePluginStore) => 2,
nameof(SettingsPaneTheme) => 3,
nameof(SettingsPaneHotkey) => 4,
nameof(SettingsPaneProxy) => 5,
nameof(SettingsPaneAbout) => 6,
_ => 0
};
NavView.SelectedItem = NavView.MenuItems[selectedIndex];
break;
}
}
private void OnClosed(object sender, EventArgs e)
{
_viewModel.PropertyChanged -= ViewModel_PropertyChanged;
// If app is exiting, settings save is not needed because main window closing event will handle this
if (App.Exiting) return;
// Save settings when window is closed

View file

@ -1,5 +1,7 @@
using Flow.Launcher.Infrastructure.UserSettings;
using System;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
using Flow.Launcher.SettingPages.Views;
namespace Flow.Launcher.ViewModel;
@ -12,6 +14,20 @@ public partial class SettingWindowViewModel : BaseModel
_settings = settings;
}
private Type _pageType = typeof(SettingsPaneGeneral);
public Type PageType
{
get => _pageType;
set
{
if (_pageType != value)
{
_pageType = value;
OnPropertyChanged();
}
}
}
public double SettingWindowWidth
{
get => _settings.SettingWindowWidth;