袩械褉械谐谢褟薪褍褌懈 写卸械褉械谢芯

淇鏍囬鏍 - 鐢∣nAttachedToVisualTree+GetVisualRoot閬嶅巻

纾 鏇 6 写薪褨胁 褌芯屑褍
斜邪褌褜泻芯
泻芯屑褨褌
6beb23ed27

+ 26 - 32
src/YZWater.Avalonia/Views/ViewAView.axaml.cs

@@ -1,3 +1,5 @@
+using Avalonia;
+using Avalonia;
 using Avalonia.Controls;
 using Avalonia.VisualTree;
 using YZWater.Avalonia.Controls;
@@ -6,51 +8,43 @@ namespace YZWater.Avalonia.Views;
 
 public partial class ViewAView : UserControl
 {
-    private Border? _titleBar;
-    private Border? _statusBar;
-    private Border? _rootBorder;
-    private TextBlock? _titleText;
-    private TextBlock? _subtitleText;
-
     public ViewAView()
     {
         InitializeComponent();
-        AttachedToVisualTree += (_, _) =>
-        {
-            FindElements();
-            ApplyTheme();
-            ThemeHelper.ThemeChanged += ApplyTheme;
-        };
-        DetachedFromVisualTree += (_, _) =>
-        {
-            ThemeHelper.ThemeChanged -= ApplyTheme;
-        };
     }
 
-    private void FindElements()
+    protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
     {
-        foreach (var v in this.GetVisualDescendants())
+        base.OnAttachedToVisualTree(e);
+        ThemeHelper.ThemeChanged += OnThemeChanged;
+        OnThemeChanged();
+    }
+
+    protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)
+    {
+        ThemeHelper.ThemeChanged -= OnThemeChanged;
+        base.OnDetachedFromVisualTree(e);
+    }
+
+    private void OnThemeChanged()
+    {
+        // 鐩存帴鐢 VisualTreeAttachmentEventArgs 鐨 Root 鎵惧厓绱
+        var root = this.GetVisualRoot() as Visual;
+        if (root == null) return;
+
+        foreach (var v in root.GetVisualDescendants())
         {
             if (v is Border b)
             {
-                if (b.Name == "TitleBar") _titleBar = b;
-                else if (b.Name == "StatusBar") _statusBar = b;
-                else if (b.Name == "RootBorder") _rootBorder = b;
+                if (b.Name == "TitleBar") b.Background = ThemeHelper.HeaderBg;
+                else if (b.Name == "StatusBar") b.Background = ThemeHelper.NavBg;
+                else if (b.Name == "RootBorder") b.Background = ThemeHelper.AppBg;
             }
             else if (v is TextBlock tb)
             {
-                if (tb.Name == "TitleText") _titleText = tb;
-                else if (tb.Name == "SubtitleText") _subtitleText = tb;
+                if (tb.Name == "TitleText") tb.Foreground = ThemeHelper.HeaderText;
+                else if (tb.Name == "SubtitleText") tb.Foreground = ThemeHelper.HeaderSubtext;
             }
         }
     }
-
-    private void ApplyTheme()
-    {
-        if (_titleBar != null) _titleBar.Background = ThemeHelper.HeaderBg;
-        if (_statusBar != null) _statusBar.Background = ThemeHelper.NavBg;
-        if (_rootBorder != null) _rootBorder.Background = ThemeHelper.AppBg;
-        if (_titleText != null) _titleText.Foreground = ThemeHelper.HeaderText;
-        if (_subtitleText != null) _subtitleText.Foreground = ThemeHelper.HeaderSubtext;
-    }
 }

+ 26 - 32
src/YZWater.Avalonia/Views/ViewBView.axaml.cs

@@ -1,3 +1,5 @@
+using Avalonia;
+using Avalonia;
 using Avalonia.Controls;
 using Avalonia.VisualTree;
 using YZWater.Avalonia.Controls;
@@ -6,51 +8,43 @@ namespace YZWater.Avalonia.Views;
 
 public partial class ViewBView : UserControl
 {
-    private Border? _titleBar;
-    private Border? _statusBar;
-    private Border? _rootBorder;
-    private TextBlock? _titleText;
-    private TextBlock? _subtitleText;
-
     public ViewBView()
     {
         InitializeComponent();
-        AttachedToVisualTree += (_, _) =>
-        {
-            FindElements();
-            ApplyTheme();
-            ThemeHelper.ThemeChanged += ApplyTheme;
-        };
-        DetachedFromVisualTree += (_, _) =>
-        {
-            ThemeHelper.ThemeChanged -= ApplyTheme;
-        };
     }
 
-    private void FindElements()
+    protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
     {
-        foreach (var v in this.GetVisualDescendants())
+        base.OnAttachedToVisualTree(e);
+        ThemeHelper.ThemeChanged += OnThemeChanged;
+        OnThemeChanged();
+    }
+
+    protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)
+    {
+        ThemeHelper.ThemeChanged -= OnThemeChanged;
+        base.OnDetachedFromVisualTree(e);
+    }
+
+    private void OnThemeChanged()
+    {
+        // 鐩存帴鐢 VisualTreeAttachmentEventArgs 鐨 Root 鎵惧厓绱
+        var root = this.GetVisualRoot() as Visual;
+        if (root == null) return;
+
+        foreach (var v in root.GetVisualDescendants())
         {
             if (v is Border b)
             {
-                if (b.Name == "TitleBar") _titleBar = b;
-                else if (b.Name == "StatusBar") _statusBar = b;
-                else if (b.Name == "RootBorder") _rootBorder = b;
+                if (b.Name == "TitleBar") b.Background = ThemeHelper.HeaderBg;
+                else if (b.Name == "StatusBar") b.Background = ThemeHelper.NavBg;
+                else if (b.Name == "RootBorder") b.Background = ThemeHelper.AppBg;
             }
             else if (v is TextBlock tb)
             {
-                if (tb.Name == "TitleText") _titleText = tb;
-                else if (tb.Name == "SubtitleText") _subtitleText = tb;
+                if (tb.Name == "TitleText") tb.Foreground = ThemeHelper.HeaderText;
+                else if (tb.Name == "SubtitleText") tb.Foreground = ThemeHelper.HeaderSubtext;
             }
         }
     }
-
-    private void ApplyTheme()
-    {
-        if (_titleBar != null) _titleBar.Background = ThemeHelper.HeaderBg;
-        if (_statusBar != null) _statusBar.Background = ThemeHelper.NavBg;
-        if (_rootBorder != null) _rootBorder.Background = ThemeHelper.AppBg;
-        if (_titleText != null) _titleText.Foreground = ThemeHelper.HeaderText;
-        if (_subtitleText != null) _subtitleText.Foreground = ThemeHelper.HeaderSubtext;
-    }
 }

+ 26 - 32
src/YZWater.Avalonia/Views/ViewCView.axaml.cs

@@ -1,3 +1,5 @@
+using Avalonia;
+using Avalonia;
 using Avalonia.Controls;
 using Avalonia.VisualTree;
 using YZWater.Avalonia.Controls;
@@ -6,51 +8,43 @@ namespace YZWater.Avalonia.Views;
 
 public partial class ViewCView : UserControl
 {
-    private Border? _titleBar;
-    private Border? _statusBar;
-    private Border? _rootBorder;
-    private TextBlock? _titleText;
-    private TextBlock? _subtitleText;
-
     public ViewCView()
     {
         InitializeComponent();
-        AttachedToVisualTree += (_, _) =>
-        {
-            FindElements();
-            ApplyTheme();
-            ThemeHelper.ThemeChanged += ApplyTheme;
-        };
-        DetachedFromVisualTree += (_, _) =>
-        {
-            ThemeHelper.ThemeChanged -= ApplyTheme;
-        };
     }
 
-    private void FindElements()
+    protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
     {
-        foreach (var v in this.GetVisualDescendants())
+        base.OnAttachedToVisualTree(e);
+        ThemeHelper.ThemeChanged += OnThemeChanged;
+        OnThemeChanged();
+    }
+
+    protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)
+    {
+        ThemeHelper.ThemeChanged -= OnThemeChanged;
+        base.OnDetachedFromVisualTree(e);
+    }
+
+    private void OnThemeChanged()
+    {
+        // 鐩存帴鐢 VisualTreeAttachmentEventArgs 鐨 Root 鎵惧厓绱
+        var root = this.GetVisualRoot() as Visual;
+        if (root == null) return;
+
+        foreach (var v in root.GetVisualDescendants())
         {
             if (v is Border b)
             {
-                if (b.Name == "TitleBar") _titleBar = b;
-                else if (b.Name == "StatusBar") _statusBar = b;
-                else if (b.Name == "RootBorder") _rootBorder = b;
+                if (b.Name == "TitleBar") b.Background = ThemeHelper.HeaderBg;
+                else if (b.Name == "StatusBar") b.Background = ThemeHelper.NavBg;
+                else if (b.Name == "RootBorder") b.Background = ThemeHelper.AppBg;
             }
             else if (v is TextBlock tb)
             {
-                if (tb.Name == "TitleText") _titleText = tb;
-                else if (tb.Name == "SubtitleText") _subtitleText = tb;
+                if (tb.Name == "TitleText") tb.Foreground = ThemeHelper.HeaderText;
+                else if (tb.Name == "SubtitleText") tb.Foreground = ThemeHelper.HeaderSubtext;
             }
         }
     }
-
-    private void ApplyTheme()
-    {
-        if (_titleBar != null) _titleBar.Background = ThemeHelper.HeaderBg;
-        if (_statusBar != null) _statusBar.Background = ThemeHelper.NavBg;
-        if (_rootBorder != null) _rootBorder.Background = ThemeHelper.AppBg;
-        if (_titleText != null) _titleText.Foreground = ThemeHelper.HeaderText;
-        if (_subtitleText != null) _subtitleText.Foreground = ThemeHelper.HeaderSubtext;
-    }
 }

+ 26 - 32
src/YZWater.Avalonia/Views/ViewDView.axaml.cs

@@ -1,3 +1,5 @@
+using Avalonia;
+using Avalonia;
 using Avalonia.Controls;
 using Avalonia.VisualTree;
 using YZWater.Avalonia.Controls;
@@ -6,51 +8,43 @@ namespace YZWater.Avalonia.Views;
 
 public partial class ViewDView : UserControl
 {
-    private Border? _titleBar;
-    private Border? _statusBar;
-    private Border? _rootBorder;
-    private TextBlock? _titleText;
-    private TextBlock? _subtitleText;
-
     public ViewDView()
     {
         InitializeComponent();
-        AttachedToVisualTree += (_, _) =>
-        {
-            FindElements();
-            ApplyTheme();
-            ThemeHelper.ThemeChanged += ApplyTheme;
-        };
-        DetachedFromVisualTree += (_, _) =>
-        {
-            ThemeHelper.ThemeChanged -= ApplyTheme;
-        };
     }
 
-    private void FindElements()
+    protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
     {
-        foreach (var v in this.GetVisualDescendants())
+        base.OnAttachedToVisualTree(e);
+        ThemeHelper.ThemeChanged += OnThemeChanged;
+        OnThemeChanged();
+    }
+
+    protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)
+    {
+        ThemeHelper.ThemeChanged -= OnThemeChanged;
+        base.OnDetachedFromVisualTree(e);
+    }
+
+    private void OnThemeChanged()
+    {
+        // 鐩存帴鐢 VisualTreeAttachmentEventArgs 鐨 Root 鎵惧厓绱
+        var root = this.GetVisualRoot() as Visual;
+        if (root == null) return;
+
+        foreach (var v in root.GetVisualDescendants())
         {
             if (v is Border b)
             {
-                if (b.Name == "TitleBar") _titleBar = b;
-                else if (b.Name == "StatusBar") _statusBar = b;
-                else if (b.Name == "RootBorder") _rootBorder = b;
+                if (b.Name == "TitleBar") b.Background = ThemeHelper.HeaderBg;
+                else if (b.Name == "StatusBar") b.Background = ThemeHelper.NavBg;
+                else if (b.Name == "RootBorder") b.Background = ThemeHelper.AppBg;
             }
             else if (v is TextBlock tb)
             {
-                if (tb.Name == "TitleText") _titleText = tb;
-                else if (tb.Name == "SubtitleText") _subtitleText = tb;
+                if (tb.Name == "TitleText") tb.Foreground = ThemeHelper.HeaderText;
+                else if (tb.Name == "SubtitleText") tb.Foreground = ThemeHelper.HeaderSubtext;
             }
         }
     }
-
-    private void ApplyTheme()
-    {
-        if (_titleBar != null) _titleBar.Background = ThemeHelper.HeaderBg;
-        if (_statusBar != null) _statusBar.Background = ThemeHelper.NavBg;
-        if (_rootBorder != null) _rootBorder.Background = ThemeHelper.AppBg;
-        if (_titleText != null) _titleText.Foreground = ThemeHelper.HeaderText;
-        if (_subtitleText != null) _subtitleText.Foreground = ThemeHelper.HeaderSubtext;
-    }
 }

+ 26 - 32
src/YZWater.Avalonia/Views/ViewEView.axaml.cs

@@ -1,3 +1,5 @@
+using Avalonia;
+using Avalonia;
 using Avalonia.Controls;
 using Avalonia.VisualTree;
 using YZWater.Avalonia.Controls;
@@ -6,51 +8,43 @@ namespace YZWater.Avalonia.Views;
 
 public partial class ViewEView : UserControl
 {
-    private Border? _titleBar;
-    private Border? _statusBar;
-    private Border? _rootBorder;
-    private TextBlock? _titleText;
-    private TextBlock? _subtitleText;
-
     public ViewEView()
     {
         InitializeComponent();
-        AttachedToVisualTree += (_, _) =>
-        {
-            FindElements();
-            ApplyTheme();
-            ThemeHelper.ThemeChanged += ApplyTheme;
-        };
-        DetachedFromVisualTree += (_, _) =>
-        {
-            ThemeHelper.ThemeChanged -= ApplyTheme;
-        };
     }
 
-    private void FindElements()
+    protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
     {
-        foreach (var v in this.GetVisualDescendants())
+        base.OnAttachedToVisualTree(e);
+        ThemeHelper.ThemeChanged += OnThemeChanged;
+        OnThemeChanged();
+    }
+
+    protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)
+    {
+        ThemeHelper.ThemeChanged -= OnThemeChanged;
+        base.OnDetachedFromVisualTree(e);
+    }
+
+    private void OnThemeChanged()
+    {
+        // 鐩存帴鐢 VisualTreeAttachmentEventArgs 鐨 Root 鎵惧厓绱
+        var root = this.GetVisualRoot() as Visual;
+        if (root == null) return;
+
+        foreach (var v in root.GetVisualDescendants())
         {
             if (v is Border b)
             {
-                if (b.Name == "TitleBar") _titleBar = b;
-                else if (b.Name == "StatusBar") _statusBar = b;
-                else if (b.Name == "RootBorder") _rootBorder = b;
+                if (b.Name == "TitleBar") b.Background = ThemeHelper.HeaderBg;
+                else if (b.Name == "StatusBar") b.Background = ThemeHelper.NavBg;
+                else if (b.Name == "RootBorder") b.Background = ThemeHelper.AppBg;
             }
             else if (v is TextBlock tb)
             {
-                if (tb.Name == "TitleText") _titleText = tb;
-                else if (tb.Name == "SubtitleText") _subtitleText = tb;
+                if (tb.Name == "TitleText") tb.Foreground = ThemeHelper.HeaderText;
+                else if (tb.Name == "SubtitleText") tb.Foreground = ThemeHelper.HeaderSubtext;
             }
         }
     }
-
-    private void ApplyTheme()
-    {
-        if (_titleBar != null) _titleBar.Background = ThemeHelper.HeaderBg;
-        if (_statusBar != null) _statusBar.Background = ThemeHelper.NavBg;
-        if (_rootBorder != null) _rootBorder.Background = ThemeHelper.AppBg;
-        if (_titleText != null) _titleText.Foreground = ThemeHelper.HeaderText;
-        if (_subtitleText != null) _subtitleText.Foreground = ThemeHelper.HeaderSubtext;
-    }
 }