更新客户端渲染,更新了壳

This commit is contained in:
QWQLwToo
2026-07-06 23:05:40 +08:00
parent e7dd87bf7e
commit 31d778710b
1311 changed files with 172662 additions and 1582 deletions
@@ -0,0 +1,125 @@
# Application Themes
WPF UI provides a robust theming system that allows you to control your application's appearance, including support for light, dark, and high contrast modes. The `ApplicationThemeManager` class is the primary tool for managing themes at runtime.
> [!IMPORTANT]
> For theme changes to apply correctly, your colors and brushes should be referenced as `DynamicResource`.
## Setting the Initial Theme
The easiest way to set the initial theme is by using the `ThemesDictionary` in your `App.xaml`. This ensures that the correct theme resources are loaded at startup.
```xml
<Application
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ui:ThemesDictionary Theme="Light" />
<ui:ControlsDictionary />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
```
The `Theme` property on `ThemesDictionary` can be set to `Light` or `Dark`.
## Changing the Theme at Runtime
Use the `ApplicationThemeManager.Apply()` method to change the theme while the application is running.
```csharp
using Wpf.Ui.Appearance;
using Wpf.Ui.Controls;
// Apply the Light theme with a Mica backdrop
ApplicationThemeManager.Apply(
ApplicationTheme.Light,
WindowBackdropType.Mica
);
```
### `ApplicationTheme` Enum
This enum specifies the theme to apply:
- `Light`: The standard light theme.
- `Dark`: The standard dark theme.
- `HighContrast`: Automatically selects the appropriate Windows High Contrast theme.
## System Theme Integration
You can synchronize your application's theme with the current Windows theme settings.
### One-Time Sync
To apply the current system theme once, use `ApplySystemTheme()`.
```csharp
// Apply the current Windows theme (light or dark)
ApplicationThemeManager.ApplySystemTheme();
```
### Automatic Tracking
For continuous synchronization, use the `SystemThemeWatcher`. It automatically updates your app's theme and accent color when the user changes their Windows settings. See the [SystemThemeWatcher documentation](./system-theme-watcher.md) for more details.
```csharp
using Wpf.Ui.Appearance;
public partial class MainWindow : System.Windows.Window
{
public MainWindow()
{
// Watch for system theme changes
SystemThemeWatcher.Watch(this);
InitializeComponent();
}
}
```
## Reading the Current Theme
You can get the current application and system themes at any time.
- `ApplicationThemeManager.GetAppTheme()`: Returns the current `ApplicationTheme` (Light, Dark, or HighContrast).
- `ApplicationThemeManager.GetSystemTheme()`: Returns the current `SystemTheme`.
```csharp
ApplicationTheme currentAppTheme = ApplicationThemeManager.GetAppTheme();
SystemTheme currentSystemTheme = ApplicationThemeManager.GetSystemTheme();
if (currentAppTheme == ApplicationTheme.Dark)
{
// ...
}
```
### `SystemTheme` Enum
This enum represents the actual theme reported by Windows, including decorative themes like `Glow`, `CapturedMotion`, and `Sunrise`. `ApplicationThemeManager` maps these to either `Light` or `Dark`.
## High Contrast Themes
WPF UI automatically handles Windows High Contrast themes. When a high contrast mode is detected, `ApplicationThemeManager` loads the appropriate high contrast resource dictionary (`HC1`, `HC2`, `HCBlack`, or `HCWhite`).
- `ApplicationThemeManager.IsHighContrast()`: Checks if the application is currently in a high contrast theme.
- `ApplicationThemeManager.IsSystemHighContrast()`: Checks if Windows is currently in a high contrast mode.
## Theme Changed Event
The `ApplicationThemeManager.Changed` event is triggered whenever the application's theme is successfully changed.
```csharp
ApplicationThemeManager.Changed += (currentTheme, currentAccent) =>
{
Debug.WriteLine($"Theme changed to {currentTheme} with accent {currentAccent}");
};
```
This event is useful for applying custom logic after a theme change, such as updating graphics or non-WPF UI elements.
> [!TIP]
> The `Changed` event is fired by both manual `Apply()` calls and automatic updates from `SystemThemeWatcher`, providing a single place to react to any theme change.