Суть проблемы
Текущий интерфейс выбора и настройки тем в AppearancePage.axaml имеет несколько проблем с UX и логикой:
- Дублирование: В выпадающем списке пресетов тем дублируется название текущей активной темы при раскрытии.
- Избыточность кнопки «Применить»: Кнопка «Применить» активна всегда, даже если выбранная тема уже полностью совпадает с текущей применённой. Это сбивает пользователя с толку.
- Исчезновение кнопок при сбросе: При нажатии кнопки «Сбросить» (Reset) визуальные элементы управления иногда пропадают из-за некорректного обновления состояния в
SettingsViewModel.
Возможное решение (Теория и архитектура)
- Фильтрация списка: В
SettingsViewModel.RefreshThemePresets переписать логику наполнения коллекции ThemePresets. Нам нужно гарантировать, что текущая кастомная тема не добавляется в список повторно, если она по цветам совпадает с одним из встроенных пресетов.
- Реактивное управление кнопкой Apply: Привязать видимость (
IsVisible) или доступность (IsEnabled) кнопок «Применить» и «Сбросить» к вычисляемому свойству HasUnsavedThemeChanges. Это свойство должно возвращать true только если цвета в пикерах (AccentColor, BgPrimaryColor и т.д.) фактически отличаются от текущей сохранённой темы в theme.json.
- Исправление сброса: В методе
ResetTheme() в SettingsViewModel явно вызывать LoadThemeColors() после сброса в ThemeManagerService, чтобы принудительно обновить свойства привязки и не допустить «залипания» UI в невалидном состоянии.
Суть проблемы
Текущий интерфейс выбора и настройки тем в
AppearancePage.axamlимеет несколько проблем с UX и логикой:SettingsViewModel.Возможное решение (Теория и архитектура)
SettingsViewModel.RefreshThemePresetsпереписать логику наполнения коллекцииThemePresets. Нам нужно гарантировать, что текущая кастомная тема не добавляется в список повторно, если она по цветам совпадает с одним из встроенных пресетов.IsVisible) или доступность (IsEnabled) кнопок «Применить» и «Сбросить» к вычисляемому свойствуHasUnsavedThemeChanges. Это свойство должно возвращатьtrueтолько если цвета в пикерах (AccentColor,BgPrimaryColorи т.д.) фактически отличаются от текущей сохранённой темы вtheme.json.ResetTheme()вSettingsViewModelявно вызыватьLoadThemeColors()после сброса вThemeManagerService, чтобы принудительно обновить свойства привязки и не допустить «залипания» UI в невалидном состоянии.