ThemedUserControl.cs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. using Avalonia.Controls;
  2. using Avalonia.Media;
  3. namespace YZWater.Avalonia.Controls;
  4. /// <summary>
  5. /// 带主题切换支持的 UserControl 基类。
  6. /// 自动在 Loaded 时应用主题并订阅 ThemeHelper.ThemeChanged,
  7. /// 在 Unloaded 时取消订阅,消除子类中的重复代码。
  8. /// 约定:子视图 AXAML 中可包含名为 TitleBar、StatusBar、RootBorder 的 Border 元素,
  9. /// 基类会自动绑定对应的主题画刷(HeaderBg / NavBg / AppBg)。
  10. /// </summary>
  11. public class ThemedUserControl : UserControl
  12. {
  13. /// <summary>
  14. /// 主题变更回调,用于在派生类中响应主题切换
  15. /// </summary>
  16. protected virtual void OnThemeChanged()
  17. {
  18. }
  19. protected ThemedUserControl()
  20. {
  21. Loaded += (_, _) =>
  22. {
  23. ApplyTheme();
  24. ThemeHelper.ThemeChanged += ApplyTheme;
  25. };
  26. Unloaded += (_, _) => ThemeHelper.ThemeChanged -= ApplyTheme;
  27. }
  28. /// <summary>
  29. /// 根据约定名称查找 TitleBar / StatusBar / RootBorder 并设置主题画刷
  30. /// </summary>
  31. private void ApplyTheme()
  32. {
  33. if (this.FindControl<Border>("TitleBar") is Border titleBar)
  34. titleBar.Background = ThemeHelper.HeaderBg;
  35. if (this.FindControl<Border>("StatusBar") is Border statusBar)
  36. statusBar.Background = ThemeHelper.NavBg;
  37. if (this.FindControl<Border>("RootBorder") is Border root)
  38. root.Background = ThemeHelper.AppBg;
  39. // 允许派生类补充自定义的主题绑定逻辑
  40. OnThemeChanged();
  41. }
  42. }