mirror of
https://github.com/claunia/marechai.git
synced 2025-12-16 19:14:25 +00:00
Add theming and a Windows 3.11 inspired theme.
This commit is contained in:
@@ -8,6 +8,7 @@
|
|||||||
<ResourceDictionary.MergedDictionaries>
|
<ResourceDictionary.MergedDictionaries>
|
||||||
<!-- Load WinUI resources -->
|
<!-- Load WinUI resources -->
|
||||||
<XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls" />
|
<XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls" />
|
||||||
|
|
||||||
<!-- Load Uno.UI.Toolkit resources -->
|
<!-- Load Uno.UI.Toolkit resources -->
|
||||||
<ToolkitResources xmlns="using:Uno.Toolkit.UI" />
|
<ToolkitResources xmlns="using:Uno.Toolkit.UI" />
|
||||||
</ResourceDictionary.MergedDictionaries>
|
</ResourceDictionary.MergedDictionaries>
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ using NewsViewModel = Marechai.App.Presentation.ViewModels.NewsViewModel;
|
|||||||
using PhotoDetailViewModel = Marechai.App.Presentation.ViewModels.PhotoDetailViewModel;
|
using PhotoDetailViewModel = Marechai.App.Presentation.ViewModels.PhotoDetailViewModel;
|
||||||
using ProcessorDetailViewModel = Marechai.App.Presentation.ViewModels.ProcessorDetailViewModel;
|
using ProcessorDetailViewModel = Marechai.App.Presentation.ViewModels.ProcessorDetailViewModel;
|
||||||
using ProcessorsListViewModel = Marechai.App.Presentation.ViewModels.ProcessorsListViewModel;
|
using ProcessorsListViewModel = Marechai.App.Presentation.ViewModels.ProcessorsListViewModel;
|
||||||
|
using SettingsViewModel = Marechai.App.Presentation.ViewModels.SettingsViewModel;
|
||||||
using SoundSynthDetailViewModel = Marechai.App.Presentation.ViewModels.SoundSynthDetailViewModel;
|
using SoundSynthDetailViewModel = Marechai.App.Presentation.ViewModels.SoundSynthDetailViewModel;
|
||||||
using SoundSynthsListViewModel = Marechai.App.Presentation.ViewModels.SoundSynthsListViewModel;
|
using SoundSynthsListViewModel = Marechai.App.Presentation.ViewModels.SoundSynthsListViewModel;
|
||||||
|
|
||||||
@@ -114,6 +115,10 @@ public partial class App : Application
|
|||||||
.ConfigureServices((context, services) =>
|
.ConfigureServices((context, services) =>
|
||||||
{
|
{
|
||||||
// Register application services
|
// Register application services
|
||||||
|
services
|
||||||
|
.AddSingleton<IColorThemeService,
|
||||||
|
ColorThemeService>();
|
||||||
|
|
||||||
services.AddSingleton<FlagCache>();
|
services.AddSingleton<FlagCache>();
|
||||||
services.AddSingleton<CompanyLogoCache>();
|
services.AddSingleton<CompanyLogoCache>();
|
||||||
services.AddSingleton<MachinePhotoCache>();
|
services.AddSingleton<MachinePhotoCache>();
|
||||||
@@ -149,6 +154,7 @@ public partial class App : Application
|
|||||||
services.AddTransient<ProcessorDetailViewModel>();
|
services.AddTransient<ProcessorDetailViewModel>();
|
||||||
services.AddTransient<SoundSynthsListViewModel>();
|
services.AddTransient<SoundSynthsListViewModel>();
|
||||||
services.AddTransient<SoundSynthDetailViewModel>();
|
services.AddTransient<SoundSynthDetailViewModel>();
|
||||||
|
services.AddTransient<SettingsViewModel>();
|
||||||
})
|
})
|
||||||
.UseNavigation(RegisterRoutes));
|
.UseNavigation(RegisterRoutes));
|
||||||
|
|
||||||
@@ -181,6 +187,7 @@ public partial class App : Application
|
|||||||
new ViewMap<ProcessorDetailPage, ProcessorDetailViewModel>(),
|
new ViewMap<ProcessorDetailPage, ProcessorDetailViewModel>(),
|
||||||
new ViewMap<SoundSynthListPage, SoundSynthsListViewModel>(),
|
new ViewMap<SoundSynthListPage, SoundSynthsListViewModel>(),
|
||||||
new ViewMap<SoundSynthDetailPage, SoundSynthDetailViewModel>(),
|
new ViewMap<SoundSynthDetailPage, SoundSynthDetailViewModel>(),
|
||||||
|
new ViewMap<SettingsPage, SettingsViewModel>(),
|
||||||
new DataViewMap<SecondPage, SecondViewModel, Entity>());
|
new DataViewMap<SecondPage, SecondViewModel, Entity>());
|
||||||
|
|
||||||
routes.Register(new RouteMap("",
|
routes.Register(new RouteMap("",
|
||||||
@@ -197,7 +204,8 @@ public partial class App : Application
|
|||||||
true),
|
true),
|
||||||
new RouteMap("computers",
|
new RouteMap("computers",
|
||||||
views.FindByViewModel<ComputersViewModel>(),
|
views.FindByViewModel<ComputersViewModel>(),
|
||||||
Nested:
|
Nested
|
||||||
|
:
|
||||||
[
|
[
|
||||||
new RouteMap("list-computers",
|
new RouteMap("list-computers",
|
||||||
views.FindByViewModel<
|
views.FindByViewModel<
|
||||||
@@ -208,7 +216,8 @@ public partial class App : Application
|
|||||||
]),
|
]),
|
||||||
new RouteMap("consoles",
|
new RouteMap("consoles",
|
||||||
views.FindByViewModel<ConsolesViewModel>(),
|
views.FindByViewModel<ConsolesViewModel>(),
|
||||||
Nested:
|
Nested
|
||||||
|
:
|
||||||
[
|
[
|
||||||
new RouteMap("list-consoles",
|
new RouteMap("list-consoles",
|
||||||
views.FindByViewModel<
|
views.FindByViewModel<
|
||||||
@@ -216,7 +225,8 @@ public partial class App : Application
|
|||||||
]),
|
]),
|
||||||
new RouteMap("companies",
|
new RouteMap("companies",
|
||||||
views.FindByViewModel<CompaniesViewModel>(),
|
views.FindByViewModel<CompaniesViewModel>(),
|
||||||
Nested:
|
Nested
|
||||||
|
:
|
||||||
[
|
[
|
||||||
new RouteMap("company-details",
|
new RouteMap("company-details",
|
||||||
views.FindByViewModel<
|
views.FindByViewModel<
|
||||||
@@ -239,7 +249,8 @@ public partial class App : Application
|
|||||||
ProcessorDetailViewModel>())
|
ProcessorDetailViewModel>())
|
||||||
]),
|
]),
|
||||||
new RouteMap("sound-synths",
|
new RouteMap("sound-synths",
|
||||||
views.FindByViewModel<SoundSynthsListViewModel>(),
|
views.FindByViewModel<
|
||||||
|
SoundSynthsListViewModel>(),
|
||||||
Nested:
|
Nested:
|
||||||
[
|
[
|
||||||
new RouteMap("sound-synth-details",
|
new RouteMap("sound-synth-details",
|
||||||
@@ -249,6 +260,8 @@ public partial class App : Application
|
|||||||
views.FindByViewModel<
|
views.FindByViewModel<
|
||||||
MachineViewViewModel>())
|
MachineViewViewModel>())
|
||||||
]),
|
]),
|
||||||
|
new RouteMap("settings",
|
||||||
|
views.FindByViewModel<SettingsViewModel>()),
|
||||||
new RouteMap("Second",
|
new RouteMap("Second",
|
||||||
views.FindByViewModel<SecondViewModel>())
|
views.FindByViewModel<SecondViewModel>())
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -35,6 +35,7 @@
|
|||||||
Localization;
|
Localization;
|
||||||
Navigation;
|
Navigation;
|
||||||
ThemeService;
|
ThemeService;
|
||||||
|
Storage;
|
||||||
SkiaRenderer;
|
SkiaRenderer;
|
||||||
Svg;
|
Svg;
|
||||||
</UnoFeatures>
|
</UnoFeatures>
|
||||||
|
|||||||
@@ -2,7 +2,9 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
|
using Marechai.App.Services;
|
||||||
using Uno.Extensions.Navigation;
|
using Uno.Extensions.Navigation;
|
||||||
|
using Uno.Extensions.Toolkit;
|
||||||
|
|
||||||
namespace Marechai.App.Presentation.ViewModels;
|
namespace Marechai.App.Presentation.ViewModels;
|
||||||
|
|
||||||
@@ -25,7 +27,7 @@ public partial class MainViewModel : ObservableObject
|
|||||||
private bool _sidebarContentVisible = true;
|
private bool _sidebarContentVisible = true;
|
||||||
|
|
||||||
public MainViewModel(IStringLocalizer localizer, IOptions<AppConfig> appInfo, INavigator navigator,
|
public MainViewModel(IStringLocalizer localizer, IOptions<AppConfig> appInfo, INavigator navigator,
|
||||||
NewsViewModel newsViewModel)
|
NewsViewModel newsViewModel, IColorThemeService colorThemeService, IThemeService themeService)
|
||||||
{
|
{
|
||||||
_navigator = navigator;
|
_navigator = navigator;
|
||||||
_localizer = localizer;
|
_localizer = localizer;
|
||||||
@@ -36,6 +38,9 @@ public partial class MainViewModel : ObservableObject
|
|||||||
|
|
||||||
GoToSecond = new AsyncRelayCommand(GoToSecondView);
|
GoToSecond = new AsyncRelayCommand(GoToSecondView);
|
||||||
|
|
||||||
|
// Initialize color theme service with theme service
|
||||||
|
_ = InitializeThemeServicesAsync(colorThemeService, themeService);
|
||||||
|
|
||||||
// Initialize localized strings
|
// Initialize localized strings
|
||||||
InitializeLocalizedStrings();
|
InitializeLocalizedStrings();
|
||||||
|
|
||||||
@@ -81,6 +86,22 @@ public partial class MainViewModel : ObservableObject
|
|||||||
public ICommand LoginLogoutCommand { get; }
|
public ICommand LoginLogoutCommand { get; }
|
||||||
public ICommand ToggleSidebarCommand { get; }
|
public ICommand ToggleSidebarCommand { get; }
|
||||||
|
|
||||||
|
private async Task InitializeThemeServicesAsync(IColorThemeService colorThemeService, IThemeService themeService)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Wait for theme service to be ready
|
||||||
|
await themeService.InitializeAsync();
|
||||||
|
|
||||||
|
// Set the theme service reference and reapply the saved theme
|
||||||
|
colorThemeService.SetThemeService(themeService);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// Silently fail - theme will work but without refresh on startup
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void InitializeLocalizedStrings()
|
private void InitializeLocalizedStrings()
|
||||||
{
|
{
|
||||||
LocalizedStrings = new Dictionary<string, string>
|
LocalizedStrings = new Dictionary<string, string>
|
||||||
|
|||||||
154
Marechai.App/Presentation/ViewModels/SettingsViewModel.cs
Normal file
154
Marechai.App/Presentation/ViewModels/SettingsViewModel.cs
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using Uno.Extensions.Toolkit;
|
||||||
|
using Marechai.App.Services;
|
||||||
|
|
||||||
|
namespace Marechai.App.Presentation.ViewModels;
|
||||||
|
|
||||||
|
public partial class SettingsViewModel : ObservableObject
|
||||||
|
{
|
||||||
|
private readonly IStringLocalizer _localizer;
|
||||||
|
private readonly IThemeService _themeService;
|
||||||
|
private readonly IColorThemeService _colorThemeService;
|
||||||
|
|
||||||
|
[ObservableProperty]
|
||||||
|
private List<ThemeOption> _availableThemes = new();
|
||||||
|
|
||||||
|
[ObservableProperty]
|
||||||
|
private ThemeOption _selectedTheme;
|
||||||
|
|
||||||
|
[ObservableProperty]
|
||||||
|
private List<ColorThemeOption> _availableColorThemes = new();
|
||||||
|
|
||||||
|
[ObservableProperty]
|
||||||
|
private ColorThemeOption _selectedColorTheme;
|
||||||
|
|
||||||
|
public SettingsViewModel(IStringLocalizer localizer, IThemeService themeService, IColorThemeService colorThemeService)
|
||||||
|
{
|
||||||
|
_localizer = localizer;
|
||||||
|
_themeService = themeService;
|
||||||
|
_colorThemeService = colorThemeService;
|
||||||
|
Title = _localizer["Settings"];
|
||||||
|
|
||||||
|
// Initialize immediately to ensure UI is populated
|
||||||
|
InitializeOptions();
|
||||||
|
|
||||||
|
// Wait for theme service to initialize
|
||||||
|
_ = InitializeThemeServiceAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async System.Threading.Tasks.Task InitializeThemeServiceAsync()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await _themeService.InitializeAsync();
|
||||||
|
|
||||||
|
// Ensure the color theme service has a reference to the theme service
|
||||||
|
_colorThemeService.SetThemeService(_themeService);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// Theme service might already be initialized
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Title { get; }
|
||||||
|
|
||||||
|
private void InitializeOptions()
|
||||||
|
{
|
||||||
|
// Initialize Light/Dark/System Themes
|
||||||
|
AvailableThemes = new List<ThemeOption>
|
||||||
|
{
|
||||||
|
new() { Theme = AppTheme.Light, DisplayName = _localizer["LightTheme"] },
|
||||||
|
new() { Theme = AppTheme.Dark, DisplayName = _localizer["DarkTheme"] },
|
||||||
|
new() { Theme = AppTheme.System, DisplayName = _localizer["SystemTheme"] }
|
||||||
|
};
|
||||||
|
|
||||||
|
// Initialize Color Themes
|
||||||
|
AvailableColorThemes = new List<ColorThemeOption>
|
||||||
|
{
|
||||||
|
new() { ThemeName = "Default", DisplayName = _localizer["DefaultColorTheme"] },
|
||||||
|
new() { ThemeName = "Windows311", DisplayName = _localizer["Windows311Theme"] }
|
||||||
|
};
|
||||||
|
|
||||||
|
// Try to load saved preferences
|
||||||
|
LoadSavedPreferences();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void LoadSavedPreferences()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Load current theme from ThemeService
|
||||||
|
var currentTheme = _themeService.Theme;
|
||||||
|
SelectedTheme = AvailableThemes.FirstOrDefault(t => t.Theme == currentTheme)
|
||||||
|
?? AvailableThemes.FirstOrDefault(t => t.Theme == AppTheme.System)
|
||||||
|
?? AvailableThemes.First();
|
||||||
|
|
||||||
|
// Load current color theme
|
||||||
|
var currentColorTheme = _colorThemeService.CurrentColorTheme;
|
||||||
|
SelectedColorTheme = AvailableColorThemes.FirstOrDefault(t => t.ThemeName == currentColorTheme)
|
||||||
|
?? AvailableColorThemes.First();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// If loading fails, use defaults
|
||||||
|
SelectedTheme = AvailableThemes.FirstOrDefault(t => t.Theme == AppTheme.System)
|
||||||
|
?? AvailableThemes.First();
|
||||||
|
SelectedColorTheme = AvailableColorThemes.First();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
partial void OnSelectedThemeChanged(ThemeOption value)
|
||||||
|
{
|
||||||
|
if (value != null)
|
||||||
|
{
|
||||||
|
ApplyTheme(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
partial void OnSelectedColorThemeChanged(ColorThemeOption value)
|
||||||
|
{
|
||||||
|
if (value != null)
|
||||||
|
{
|
||||||
|
ApplyColorTheme(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void ApplyTheme(ThemeOption theme)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Apply theme immediately using ThemeService
|
||||||
|
await _themeService.SetThemeAsync(theme.Theme);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// Silently fail
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ApplyColorTheme(ColorThemeOption colorTheme)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_colorThemeService.ApplyColorTheme(colorTheme.ThemeName);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// Silently fail
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ThemeOption
|
||||||
|
{
|
||||||
|
public AppTheme Theme { get; set; }
|
||||||
|
public string DisplayName { get; set; } = string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ColorThemeOption
|
||||||
|
{
|
||||||
|
public string ThemeName { get; set; } = string.Empty;
|
||||||
|
public string DisplayName { get; set; } = string.Empty;
|
||||||
|
}
|
||||||
89
Marechai.App/Presentation/Views/SettingsPage.xaml
Normal file
89
Marechai.App/Presentation/Views/SettingsPage.xaml
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Page x:Class="Marechai.App.Presentation.Views.SettingsPage"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:vm="using:Marechai.App.Presentation.ViewModels"
|
||||||
|
xmlns:utu="using:Uno.Toolkit.UI"
|
||||||
|
mc:Ignorable="d"
|
||||||
|
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
|
||||||
|
|
||||||
|
<Grid utu:SafeArea.Insets="VisibleBounds" Margin="16">
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="Auto"/>
|
||||||
|
<RowDefinition Height="*"/>
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
|
||||||
|
<!-- Header -->
|
||||||
|
<TextBlock Grid.Row="0"
|
||||||
|
Text="{Binding Title}"
|
||||||
|
Style="{ThemeResource TitleTextBlockStyle}"
|
||||||
|
Margin="0,0,0,24"/>
|
||||||
|
|
||||||
|
<!-- Settings Content -->
|
||||||
|
<ScrollViewer Grid.Row="1"
|
||||||
|
VerticalScrollBarVisibility="Auto">
|
||||||
|
<StackPanel Spacing="24" MaxWidth="600" HorizontalAlignment="Left">
|
||||||
|
|
||||||
|
<!-- Theme Section -->
|
||||||
|
<StackPanel Spacing="8">
|
||||||
|
<TextBlock x:Uid="SettingsPage_ThemeSection_Header"
|
||||||
|
Text="Appearance"
|
||||||
|
Style="{ThemeResource SubtitleTextBlockStyle}"/>
|
||||||
|
|
||||||
|
<TextBlock x:Uid="SettingsPage_ThemeSection_Description"
|
||||||
|
Text="Select your preferred color theme"
|
||||||
|
Style="{ThemeResource BodyTextBlockStyle}"
|
||||||
|
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
|
||||||
|
TextWrapping="Wrap"
|
||||||
|
Margin="0,0,0,8"/>
|
||||||
|
|
||||||
|
<!-- Brightness Theme Selector (Light/Dark/System) -->
|
||||||
|
<ComboBox x:Name="BrightnessThemeSelector"
|
||||||
|
x:Uid="SettingsPage_BrightnessThemeSelector"
|
||||||
|
Header="Brightness"
|
||||||
|
ItemsSource="{Binding AvailableThemes}"
|
||||||
|
SelectedItem="{Binding SelectedTheme, Mode=TwoWay}"
|
||||||
|
HorizontalAlignment="Stretch"
|
||||||
|
MinWidth="250"
|
||||||
|
Margin="0,0,0,12">
|
||||||
|
<ComboBox.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<TextBlock Text="{Binding DisplayName}" />
|
||||||
|
</DataTemplate>
|
||||||
|
</ComboBox.ItemTemplate>
|
||||||
|
</ComboBox>
|
||||||
|
|
||||||
|
<!-- Color Theme Selector (Default/Windows 3.11) -->
|
||||||
|
<ComboBox x:Name="ColorThemeSelector"
|
||||||
|
x:Uid="SettingsPage_ColorThemeSelector"
|
||||||
|
Header="Color Theme"
|
||||||
|
ItemsSource="{Binding AvailableColorThemes}"
|
||||||
|
SelectedItem="{Binding SelectedColorTheme, Mode=TwoWay}"
|
||||||
|
HorizontalAlignment="Stretch"
|
||||||
|
MinWidth="250">
|
||||||
|
<ComboBox.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<TextBlock Text="{Binding DisplayName}" />
|
||||||
|
</DataTemplate>
|
||||||
|
</ComboBox.ItemTemplate>
|
||||||
|
</ComboBox>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<!-- Placeholder for future settings sections -->
|
||||||
|
<StackPanel Spacing="8">
|
||||||
|
<TextBlock x:Uid="SettingsPage_AboutSection_Header"
|
||||||
|
Text="About"
|
||||||
|
Style="{ThemeResource SubtitleTextBlockStyle}"/>
|
||||||
|
|
||||||
|
<TextBlock x:Uid="SettingsPage_Version"
|
||||||
|
Text="Version 1.0"
|
||||||
|
Style="{ThemeResource BodyTextBlockStyle}"
|
||||||
|
Foreground="{ThemeResource TextFillColorSecondaryBrush}"/>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
</StackPanel>
|
||||||
|
</ScrollViewer>
|
||||||
|
</Grid>
|
||||||
|
</Page>
|
||||||
14
Marechai.App/Presentation/Views/SettingsPage.xaml.cs
Normal file
14
Marechai.App/Presentation/Views/SettingsPage.xaml.cs
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
using Marechai.App.Presentation.ViewModels;
|
||||||
|
using Microsoft.UI.Xaml.Controls;
|
||||||
|
|
||||||
|
namespace Marechai.App.Presentation.Views;
|
||||||
|
|
||||||
|
public sealed partial class SettingsPage : Page
|
||||||
|
{
|
||||||
|
public SettingsPage()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public SettingsViewModel? ViewModel => DataContext as SettingsViewModel;
|
||||||
|
}
|
||||||
148
Marechai.App/Services/ColorThemeService.cs
Normal file
148
Marechai.App/Services/ColorThemeService.cs
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Windows.Storage;
|
||||||
|
using Microsoft.UI.Xaml;
|
||||||
|
using Uno.Extensions.Toolkit;
|
||||||
|
|
||||||
|
namespace Marechai.App.Services;
|
||||||
|
|
||||||
|
public interface IColorThemeService
|
||||||
|
{
|
||||||
|
string CurrentColorTheme { get; }
|
||||||
|
IReadOnlyList<string> AvailableColorThemes { get; }
|
||||||
|
void ApplyColorTheme(string themeName);
|
||||||
|
void SetThemeService(IThemeService themeService);
|
||||||
|
void ReapplyCurrentTheme();
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ColorThemeService : IColorThemeService
|
||||||
|
{
|
||||||
|
private const string COLOR_THEME_KEY = "ColorTheme";
|
||||||
|
private const string DEFAULT_THEME = "Default";
|
||||||
|
private IThemeService _themeService;
|
||||||
|
|
||||||
|
public ColorThemeService()
|
||||||
|
{
|
||||||
|
LoadSavedTheme();
|
||||||
|
}
|
||||||
|
|
||||||
|
public string CurrentColorTheme { get; private set; } = DEFAULT_THEME;
|
||||||
|
|
||||||
|
public IReadOnlyList<string> AvailableColorThemes => new List<string>
|
||||||
|
{
|
||||||
|
DEFAULT_THEME,
|
||||||
|
"Windows311"
|
||||||
|
};
|
||||||
|
|
||||||
|
public void SetThemeService(IThemeService themeService)
|
||||||
|
{
|
||||||
|
_themeService = themeService;
|
||||||
|
|
||||||
|
// Reapply the current theme now that we have the theme service
|
||||||
|
if(CurrentColorTheme != DEFAULT_THEME) ReapplyCurrentTheme();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ReapplyCurrentTheme()
|
||||||
|
{
|
||||||
|
// Force refresh of the current theme
|
||||||
|
ApplyColorTheme(CurrentColorTheme);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ApplyColorTheme(string themeName)
|
||||||
|
{
|
||||||
|
if(!AvailableColorThemes.Contains(themeName)) return;
|
||||||
|
|
||||||
|
CurrentColorTheme = themeName;
|
||||||
|
|
||||||
|
// Save preference
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings;
|
||||||
|
localSettings.Values[COLOR_THEME_KEY] = themeName;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// Silently fail
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply the theme by rebuilding merged dictionaries
|
||||||
|
Application app = Application.Current;
|
||||||
|
|
||||||
|
if(app?.Resources == null) return;
|
||||||
|
|
||||||
|
// Store the existing merged dictionaries (except color overrides)
|
||||||
|
var existingDictionaries = app.Resources.MergedDictionaries
|
||||||
|
.Where(d => d.Source?.OriginalString?.Contains("ColorPaletteOverride") != true)
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
// Clear all merged dictionaries
|
||||||
|
app.Resources.MergedDictionaries.Clear();
|
||||||
|
|
||||||
|
// Re-add the existing dictionaries
|
||||||
|
foreach(ResourceDictionary dict in existingDictionaries) app.Resources.MergedDictionaries.Add(dict);
|
||||||
|
|
||||||
|
// Add the new color theme if not default
|
||||||
|
if(themeName != DEFAULT_THEME)
|
||||||
|
{
|
||||||
|
var newDictionary = new ResourceDictionary
|
||||||
|
{
|
||||||
|
Source = new Uri("ms-appx:///Styles/ColorPaletteOverride.xaml")
|
||||||
|
};
|
||||||
|
|
||||||
|
app.Resources.MergedDictionaries.Add(newDictionary);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Force UI refresh by toggling the theme temporarily
|
||||||
|
ForceThemeRefresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LoadSavedTheme()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings;
|
||||||
|
|
||||||
|
if(localSettings.Values.ContainsKey(COLOR_THEME_KEY))
|
||||||
|
{
|
||||||
|
var savedTheme = localSettings.Values[COLOR_THEME_KEY] as string;
|
||||||
|
|
||||||
|
if(!string.IsNullOrEmpty(savedTheme) && AvailableColorThemes.Contains(savedTheme))
|
||||||
|
{
|
||||||
|
CurrentColorTheme = savedTheme;
|
||||||
|
ApplyColorTheme(CurrentColorTheme);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// If loading fails, use default theme
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void ForceThemeRefresh()
|
||||||
|
{
|
||||||
|
if(_themeService == null) return;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Get current theme
|
||||||
|
AppTheme currentTheme = _themeService.Theme;
|
||||||
|
|
||||||
|
// Toggle to opposite theme briefly
|
||||||
|
AppTheme tempTheme = currentTheme == AppTheme.Light ? AppTheme.Dark : AppTheme.Light;
|
||||||
|
await _themeService.SetThemeAsync(tempTheme);
|
||||||
|
|
||||||
|
// Small delay to ensure the change is applied
|
||||||
|
await Task.Delay(50);
|
||||||
|
|
||||||
|
// Switch back to original theme
|
||||||
|
await _themeService.SetThemeAsync(currentTheme);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// Silently fail
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -166,4 +166,50 @@
|
|||||||
<data name="Company was renamed on an unknown date to an unknown name." xml:space="preserve">
|
<data name="Company was renamed on an unknown date to an unknown name." xml:space="preserve">
|
||||||
<value>Company was renamed on an unknown date to an unknown name.</value>
|
<value>Company was renamed on an unknown date to an unknown name.</value>
|
||||||
</data>
|
</data>
|
||||||
|
|
||||||
|
<data name="SettingsPage_ThemeSection_Header.Text" xml:space="preserve">
|
||||||
|
<value>Appearance</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_ThemeSection_Description.Text" xml:space="preserve">
|
||||||
|
<value>Select your preferred theme</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_ThemeSelector.Header" xml:space="preserve">
|
||||||
|
<value>Theme</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_ThemeChange_Notice.Text" xml:space="preserve">
|
||||||
|
<value>Theme changes will be applied the next time you start the application.</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_AboutSection_Header.Text" xml:space="preserve">
|
||||||
|
<value>About</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_Version.Text" xml:space="preserve">
|
||||||
|
<value>Version 1.0</value>
|
||||||
|
</data>
|
||||||
|
<data name="LightTheme" xml:space="preserve">
|
||||||
|
<value>Light</value>
|
||||||
|
</data>
|
||||||
|
<data name="DarkTheme" xml:space="preserve">
|
||||||
|
<value>Dark</value>
|
||||||
|
</data>
|
||||||
|
<data name="SystemTheme" xml:space="preserve">
|
||||||
|
<value>System</value>
|
||||||
|
</data>
|
||||||
|
<data name="DefaultColorTheme" xml:space="preserve">
|
||||||
|
<value>Default</value>
|
||||||
|
</data>
|
||||||
|
<data name="Windows311Theme" xml:space="preserve">
|
||||||
|
<value>Windows 3.11</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_BrightnessThemeSelector.Header" xml:space="preserve">
|
||||||
|
<value>Brightness</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_ColorThemeSelector.Header" xml:space="preserve">
|
||||||
|
<value>Color Theme</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_DesignSystemSelector.Header" xml:space="preserve">
|
||||||
|
<value>Design System</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_DesignSystemChange_Notice.Text" xml:space="preserve">
|
||||||
|
<value>Design system changes will be applied the next time you start the application. Color theme changes are applied immediately.</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -166,4 +166,50 @@
|
|||||||
<data name="Company was renamed on an unknown date to an unknown name." xml:space="preserve">
|
<data name="Company was renamed on an unknown date to an unknown name." xml:space="preserve">
|
||||||
<value>La empresa fue renombrada en una fecha desconocida a un nombre desconocido.</value>
|
<value>La empresa fue renombrada en una fecha desconocida a un nombre desconocido.</value>
|
||||||
</data>
|
</data>
|
||||||
|
|
||||||
|
<data name="SettingsPage_ThemeSection_Header.Text" xml:space="preserve">
|
||||||
|
<value>Apariencia</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_ThemeSection_Description.Text" xml:space="preserve">
|
||||||
|
<value>Seleccione su tema preferido</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_ThemeSelector.Header" xml:space="preserve">
|
||||||
|
<value>Tema</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_ThemeChange_Notice.Text" xml:space="preserve">
|
||||||
|
<value>Los cambios de tema se aplicarán la próxima vez que inicie la aplicación.</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_AboutSection_Header.Text" xml:space="preserve">
|
||||||
|
<value>Acerca de</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_Version.Text" xml:space="preserve">
|
||||||
|
<value>Versión 1.0</value>
|
||||||
|
</data>
|
||||||
|
<data name="LightTheme" xml:space="preserve">
|
||||||
|
<value>Claro</value>
|
||||||
|
</data>
|
||||||
|
<data name="DarkTheme" xml:space="preserve">
|
||||||
|
<value>Oscuro</value>
|
||||||
|
</data>
|
||||||
|
<data name="SystemTheme" xml:space="preserve">
|
||||||
|
<value>Sistema</value>
|
||||||
|
</data>
|
||||||
|
<data name="DefaultColorTheme" xml:space="preserve">
|
||||||
|
<value>Predeterminado</value>
|
||||||
|
</data>
|
||||||
|
<data name="Windows311Theme" xml:space="preserve">
|
||||||
|
<value>Windows 3.11</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_BrightnessThemeSelector.Header" xml:space="preserve">
|
||||||
|
<value>Brillo</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_ColorThemeSelector.Header" xml:space="preserve">
|
||||||
|
<value>Tema de Color</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_DesignSystemSelector.Header" xml:space="preserve">
|
||||||
|
<value>Sistema de Diseño</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_DesignSystemChange_Notice.Text" xml:space="preserve">
|
||||||
|
<value>Los cambios del sistema de diseño se aplicarán la próxima vez que inicie la aplicación. Los cambios de tema de color se aplican inmediatamente.</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -166,4 +166,50 @@
|
|||||||
<data name="Company was renamed on an unknown date to an unknown name." xml:space="preserve">
|
<data name="Company was renamed on an unknown date to an unknown name." xml:space="preserve">
|
||||||
<value>L'entreprise a été renommée à une date inconnue en un nom inconnu.</value>
|
<value>L'entreprise a été renommée à une date inconnue en un nom inconnu.</value>
|
||||||
</data>
|
</data>
|
||||||
|
|
||||||
|
<data name="SettingsPage_ThemeSection_Header.Text" xml:space="preserve">
|
||||||
|
<value>Apparence</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_ThemeSection_Description.Text" xml:space="preserve">
|
||||||
|
<value>Sélectionnez votre thème préféré</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_ThemeSelector.Header" xml:space="preserve">
|
||||||
|
<value>Thème</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_ThemeChange_Notice.Text" xml:space="preserve">
|
||||||
|
<value>Les modifications du thème seront appliquées au prochain démarrage de l'application.</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_AboutSection_Header.Text" xml:space="preserve">
|
||||||
|
<value>À propos</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_Version.Text" xml:space="preserve">
|
||||||
|
<value>Version 1.0</value>
|
||||||
|
</data>
|
||||||
|
<data name="LightTheme" xml:space="preserve">
|
||||||
|
<value>Clair</value>
|
||||||
|
</data>
|
||||||
|
<data name="DarkTheme" xml:space="preserve">
|
||||||
|
<value>Sombre</value>
|
||||||
|
</data>
|
||||||
|
<data name="SystemTheme" xml:space="preserve">
|
||||||
|
<value>Système</value>
|
||||||
|
</data>
|
||||||
|
<data name="DefaultColorTheme" xml:space="preserve">
|
||||||
|
<value>Par défaut</value>
|
||||||
|
</data>
|
||||||
|
<data name="Windows311Theme" xml:space="preserve">
|
||||||
|
<value>Windows 3.11</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_BrightnessThemeSelector.Header" xml:space="preserve">
|
||||||
|
<value>Luminosité</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_ColorThemeSelector.Header" xml:space="preserve">
|
||||||
|
<value>Thème de Couleur</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_DesignSystemSelector.Header" xml:space="preserve">
|
||||||
|
<value>Système de Conception</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_DesignSystemChange_Notice.Text" xml:space="preserve">
|
||||||
|
<value>Les modifications du système de conception seront appliquées au prochain démarrage de l'application. Les modifications du thème de couleur sont appliquées immédiatement.</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -166,4 +166,50 @@
|
|||||||
<data name="Company was renamed on an unknown date to an unknown name." xml:space="preserve">
|
<data name="Company was renamed on an unknown date to an unknown name." xml:space="preserve">
|
||||||
<value>A empresa foi renomeada em uma data desconhecida para um nome desconhecido.</value>
|
<value>A empresa foi renomeada em uma data desconhecida para um nome desconhecido.</value>
|
||||||
</data>
|
</data>
|
||||||
|
|
||||||
|
<data name="SettingsPage_ThemeSection_Header.Text" xml:space="preserve">
|
||||||
|
<value>Aparência</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_ThemeSection_Description.Text" xml:space="preserve">
|
||||||
|
<value>Selecione o seu tema preferido</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_ThemeSelector.Header" xml:space="preserve">
|
||||||
|
<value>Tema</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_ThemeChange_Notice.Text" xml:space="preserve">
|
||||||
|
<value>As alterações de tema serão aplicadas na próxima vez que você iniciar o aplicativo.</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_AboutSection_Header.Text" xml:space="preserve">
|
||||||
|
<value>Sobre</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_Version.Text" xml:space="preserve">
|
||||||
|
<value>Versão 1.0</value>
|
||||||
|
</data>
|
||||||
|
<data name="LightTheme" xml:space="preserve">
|
||||||
|
<value>Claro</value>
|
||||||
|
</data>
|
||||||
|
<data name="DarkTheme" xml:space="preserve">
|
||||||
|
<value>Escuro</value>
|
||||||
|
</data>
|
||||||
|
<data name="SystemTheme" xml:space="preserve">
|
||||||
|
<value>Sistema</value>
|
||||||
|
</data>
|
||||||
|
<data name="DefaultColorTheme" xml:space="preserve">
|
||||||
|
<value>Padrão</value>
|
||||||
|
</data>
|
||||||
|
<data name="Windows311Theme" xml:space="preserve">
|
||||||
|
<value>Windows 3.11</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_BrightnessThemeSelector.Header" xml:space="preserve">
|
||||||
|
<value>Brilho</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_ColorThemeSelector.Header" xml:space="preserve">
|
||||||
|
<value>Tema de Cor</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_DesignSystemSelector.Header" xml:space="preserve">
|
||||||
|
<value>Sistema de Design</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPage_DesignSystemChange_Notice.Text" xml:space="preserve">
|
||||||
|
<value>As alterações do sistema de design serão aplicadas na próxima vez que você iniciar o aplicativo. As alterações de tema de cor são aplicadas imediatamente.</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
86
Marechai.App/Styles/ColorPaletteOverride.xaml
Normal file
86
Marechai.App/Styles/ColorPaletteOverride.xaml
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||||
|
|
||||||
|
<!-- Windows 3.11 Color Theme -->
|
||||||
|
<!-- Classic teal/cyan desktop background and gray window chrome -->
|
||||||
|
|
||||||
|
<!-- System Colors -->
|
||||||
|
<Color x:Key="SystemAccentColor">#008080</Color>
|
||||||
|
<Color x:Key="SystemAccentColorLight1">#00A0A0</Color>
|
||||||
|
<Color x:Key="SystemAccentColorLight2">#00C0C0</Color>
|
||||||
|
<Color x:Key="SystemAccentColorLight3">#00E0E0</Color>
|
||||||
|
<Color x:Key="SystemAccentColorDark1">#006060</Color>
|
||||||
|
<Color x:Key="SystemAccentColorDark2">#004040</Color>
|
||||||
|
<Color x:Key="SystemAccentColorDark3">#002020</Color>
|
||||||
|
|
||||||
|
<!-- Background Colors - Classic Windows 3.11 teal -->
|
||||||
|
<SolidColorBrush x:Key="ApplicationPageBackgroundThemeBrush" Color="#008080" />
|
||||||
|
<SolidColorBrush x:Key="LayerFillColorDefaultBrush" Color="#C0C0C0" />
|
||||||
|
<SolidColorBrush x:Key="LayerFillColorAltBrush" Color="#C0C0C0" />
|
||||||
|
|
||||||
|
<!-- Card and Surface Colors - Gray window chrome -->
|
||||||
|
<SolidColorBrush x:Key="CardBackgroundFillColorDefaultBrush" Color="#C0C0C0" />
|
||||||
|
<SolidColorBrush x:Key="CardBackgroundFillColorSecondaryBrush" Color="#C0C0C0" />
|
||||||
|
<SolidColorBrush x:Key="SurfaceFillColorDefaultBrush" Color="#C0C0C0" />
|
||||||
|
<SolidColorBrush x:Key="ControlFillColorDefaultBrush" Color="#C0C0C0" />
|
||||||
|
|
||||||
|
<!-- Accent Colors - Classic teal -->
|
||||||
|
<SolidColorBrush x:Key="AccentFillColorDefaultBrush" Color="#008080" />
|
||||||
|
<SolidColorBrush x:Key="AccentFillColorSecondaryBrush" Color="#006060" />
|
||||||
|
<SolidColorBrush x:Key="AccentFillColorTertiaryBrush" Color="#004040" />
|
||||||
|
|
||||||
|
<!-- Text Colors - Classic black text on gray -->
|
||||||
|
<SolidColorBrush x:Key="TextFillColorPrimaryBrush" Color="#000000" />
|
||||||
|
<SolidColorBrush x:Key="TextFillColorSecondaryBrush" Color="#404040" />
|
||||||
|
<SolidColorBrush x:Key="TextFillColorTertiaryBrush" Color="#606060" />
|
||||||
|
<SolidColorBrush x:Key="TextFillColorDisabledBrush" Color="#808080" />
|
||||||
|
|
||||||
|
<!-- Border Colors - Classic 3D borders -->
|
||||||
|
<SolidColorBrush x:Key="CardStrokeColorDefaultBrush" Color="#808080" />
|
||||||
|
<SolidColorBrush x:Key="ControlStrokeColorDefaultBrush" Color="#808080" />
|
||||||
|
<SolidColorBrush x:Key="ControlStrokeColorSecondaryBrush" Color="#808080" />
|
||||||
|
<SolidColorBrush x:Key="DividerStrokeColorDefaultBrush" Color="#808080" />
|
||||||
|
|
||||||
|
<!-- Button Colors -->
|
||||||
|
<SolidColorBrush x:Key="ButtonBackgroundBrush" Color="#C0C0C0" />
|
||||||
|
<SolidColorBrush x:Key="ButtonBackgroundPointerOver" Color="#D0D0D0" />
|
||||||
|
<SolidColorBrush x:Key="ButtonBackgroundPressed" Color="#808080" />
|
||||||
|
<SolidColorBrush x:Key="ButtonForeground" Color="#000000" />
|
||||||
|
|
||||||
|
<!-- NavigationView Colors -->
|
||||||
|
<SolidColorBrush x:Key="NavigationViewDefaultPaneBackground" Color="#C0C0C0" />
|
||||||
|
<SolidColorBrush x:Key="NavigationViewTopPaneBackground" Color="#C0C0C0" />
|
||||||
|
<SolidColorBrush x:Key="NavigationViewExpandedPaneBackground" Color="#C0C0C0" />
|
||||||
|
|
||||||
|
<!-- List and Item Colors -->
|
||||||
|
<SolidColorBrush x:Key="ListViewItemBackgroundBrush" Color="#FFFFFF" />
|
||||||
|
<SolidColorBrush x:Key="ListViewItemBackgroundPointerOver" Color="#E0E0E0" />
|
||||||
|
<SolidColorBrush x:Key="ListViewItemBackgroundSelected" Color="#000080" />
|
||||||
|
<SolidColorBrush x:Key="ListViewItemForegroundSelected" Color="#FFFFFF" />
|
||||||
|
|
||||||
|
<!-- Subtle Fill Colors -->
|
||||||
|
<SolidColorBrush x:Key="SubtleFillColorTransparentBrush" Color="Transparent" />
|
||||||
|
<SolidColorBrush x:Key="SubtleFillColorSecondaryBrush" Color="#E0E0E0" />
|
||||||
|
<SolidColorBrush x:Key="SubtleFillColorTertiaryBrush" Color="#D0D0D0" />
|
||||||
|
|
||||||
|
<!-- Control Colors -->
|
||||||
|
<SolidColorBrush x:Key="ControlFillColorSecondaryBrush" Color="#D0D0D0" />
|
||||||
|
<SolidColorBrush x:Key="ControlFillColorTertiaryBrush" Color="#E0E0E0" />
|
||||||
|
<SolidColorBrush x:Key="ControlFillColorDisabledBrush" Color="#A0A0A0" />
|
||||||
|
|
||||||
|
<!-- TextBox Colors -->
|
||||||
|
<SolidColorBrush x:Key="TextControlBackground" Color="#FFFFFF" />
|
||||||
|
<SolidColorBrush x:Key="TextControlBackgroundPointerOver" Color="#FFFFFF" />
|
||||||
|
<SolidColorBrush x:Key="TextControlBackgroundFocused" Color="#FFFFFF" />
|
||||||
|
<SolidColorBrush x:Key="TextControlForeground" Color="#000000" />
|
||||||
|
<SolidColorBrush x:Key="TextControlBorderBrush" Color="#808080" />
|
||||||
|
|
||||||
|
<!-- ComboBox Colors -->
|
||||||
|
<SolidColorBrush x:Key="ComboBoxBackground" Color="#FFFFFF" />
|
||||||
|
<SolidColorBrush x:Key="ComboBoxBackgroundPointerOver" Color="#FFFFFF" />
|
||||||
|
<SolidColorBrush x:Key="ComboBoxBackgroundPressed" Color="#FFFFFF" />
|
||||||
|
<SolidColorBrush x:Key="ComboBoxBackgroundFocused" Color="#FFFFFF" />
|
||||||
|
<SolidColorBrush x:Key="ComboBoxForeground" Color="#000000" />
|
||||||
|
<SolidColorBrush x:Key="ComboBoxBorderBrush" Color="#808080" />
|
||||||
|
|
||||||
|
</ResourceDictionary>
|
||||||
Reference in New Issue
Block a user