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();
}
}