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