| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- using Avalonia.Controls;
- using Avalonia.Media;
- namespace YZWater.Avalonia.Controls;
- /// <summary>
- /// 带主题切换支持的 UserControl 基类。
- /// 自动在 Loaded 时应用主题并订阅 ThemeHelper.ThemeChanged,
- /// 在 Unloaded 时取消订阅,消除子类中的重复代码。
- /// 约定:子视图 AXAML 中可包含名为 TitleBar、StatusBar、RootBorder 的 Border 元素,
- /// 基类会自动绑定对应的主题画刷(HeaderBg / NavBg / AppBg)。
- /// </summary>
- public class ThemedUserControl : UserControl
- {
- /// <summary>
- /// 主题变更回调,用于在派生类中响应主题切换
- /// </summary>
- protected virtual void OnThemeChanged()
- {
- }
- protected ThemedUserControl()
- {
- Loaded += (_, _) =>
- {
- ApplyTheme();
- ThemeHelper.ThemeChanged += ApplyTheme;
- };
- Unloaded += (_, _) => ThemeHelper.ThemeChanged -= ApplyTheme;
- }
- /// <summary>
- /// 根据约定名称查找 TitleBar / StatusBar / RootBorder 并设置主题画刷
- /// </summary>
- private void ApplyTheme()
- {
- if (this.FindControl<Border>("TitleBar") is Border titleBar)
- titleBar.Background = ThemeHelper.HeaderBg;
- if (this.FindControl<Border>("StatusBar") is Border statusBar)
- statusBar.Background = ThemeHelper.NavBg;
- if (this.FindControl<Border>("RootBorder") is Border root)
- root.Background = ThemeHelper.AppBg;
- // 允许派生类补充自定义的主题绑定逻辑
- OnThemeChanged();
- }
- }
|