Sfoglia il codice sorgente

娴嬭瘯 - 鍘绘帀浠g爜鍚庣疆涓婚閫昏緫锛岀函DynamicResource

纾 鏇 6 giorni fa
parent
commit
021645cb9b

+ 1 - 0
src/YZWater.Avalonia/Controls/ThemeHelper.cs

@@ -33,6 +33,7 @@ internal static class ThemeHelper
     /// </summary>
     public static void SetTheme(bool isDark)
     {
+        Console.WriteLine($"[ThemeHelper] SetTheme: isDark={isDark}, current HeaderBg={((SolidColorBrush)HeaderBg).Color}");
         if (isDark)
         {
             AppBg = new SolidColorBrush(Color.Parse("#0A0E14"));

+ 3 - 3
src/YZWater.Avalonia/Views/MainWindow.axaml

@@ -10,7 +10,7 @@
         Width="1280" Height="800"
         MinWidth="1024" MinHeight="700"
         WindowStartupLocation="CenterScreen"
-        Background="#0A0E14">
+        Background="{DynamicResource AppBgBrush}">
 
     <Window.DataContext>
         <vm:MainViewModel/>
@@ -18,7 +18,7 @@
 
     <DockPanel>
         <!-- 鈺愨晲鈺 搴曢儴瀵艰埅鏍 鈺愨晲鈺 -->
-        <Border x:Name="NavBar" DockPanel.Dock="Bottom" Background="#111820"
+        <Border x:Name="NavBar" DockPanel.Dock="Bottom" Background="{DynamicResource NavBgBrush}"
                 BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,1,0,0" Padding="4,0">
             <Grid ColumnDefinitions="*,Auto,Auto">
                 <!-- 瀵艰埅鎸夐挳 -->
@@ -95,7 +95,7 @@
         </Border>
 
         <!-- 鈺愨晲鈺 涓诲唴瀹瑰尯鍩 鈺愨晲鈺 -->
-        <TabControl SelectedIndex="{Binding SelectedTabIndex}" Background="#0A0E14">
+        <TabControl SelectedIndex="{Binding SelectedTabIndex}" Background="{DynamicResource AppBgBrush}">
             <TabItem Header="PROCESS" IsVisible="False">
                 <views:ViewAView/>
             </TabItem>

+ 4 - 4
src/YZWater.Avalonia/Views/ViewAView.axaml

@@ -9,11 +9,11 @@
         <vm:ViewAViewModel/>
     </UserControl.DataContext>
 
-    <Border x:Name="RootBorder" Background="#0A0E14">
+    <Border x:Name="RootBorder" Background="{DynamicResource AppBgBrush}">
         <Grid RowDefinitions="48,*,32">
 
             <!-- 鈺愨晲鈺 椤堕儴鏍囬鏍 鈺愨晲鈺 -->
-            <Border x:Name="TitleBar" Grid.Row="0" Background="#111820" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,0,1">
+            <Border x:Name="TitleBar" Grid.Row="0" Background="{DynamicResource HeaderBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,0,1">
                 <Grid ColumnDefinitions="Auto,*,Auto,Auto,Auto" Margin="16,0">
                     <StackPanel Grid.Column="0" Orientation="Horizontal" Spacing="12" VerticalAlignment="Center">
                         <Border Background="{DynamicResource SuccessBrush}" Width="4" Height="24" CornerRadius="2"/>
@@ -21,7 +21,7 @@
                                    Foreground="{DynamicResource TextPrimaryBrush}" FontFamily="Consolas, monospace"
                                    VerticalAlignment="Center"/>
                         <TextBlock x:Name="SubtitleText" Text="{Binding SubtitleText}" FontSize="12"
-                                   Foreground="#9CA3AF" VerticalAlignment="Center"/>
+                                   Foreground="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
                     </StackPanel>
 
                     <StackPanel Grid.Column="2" Orientation="Horizontal" Spacing="8" VerticalAlignment="Center" Margin="24,0">
@@ -400,7 +400,7 @@
             </Grid>
 
             <!-- 鈺愨晲鈺 搴曢儴鐘舵佹爮 鈺愨晲鈺 -->
-            <Border x:Name="StatusBar" Grid.Row="2" Background="#111820" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,1,0,0">
+            <Border x:Name="StatusBar" Grid.Row="2" Background="{DynamicResource NavBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,1,0,0">
                 <Grid ColumnDefinitions="Auto,*,Auto,Auto,Auto,Auto" Margin="16,0">
                     <TextBlock Grid.Column="0" VerticalAlignment="Center"
                                FontFamily="Consolas, monospace" FontSize="11" Foreground="{DynamicResource TextDisabledBrush}">

+ 0 - 40
src/YZWater.Avalonia/Views/ViewAView.axaml.cs

@@ -1,6 +1,4 @@
 using Avalonia.Controls;
-using Avalonia.VisualTree;
-using YZWater.Avalonia.Controls;
 
 namespace YZWater.Avalonia.Views;
 
@@ -9,43 +7,5 @@ public partial class ViewAView : UserControl
     public ViewAView()
     {
         InitializeComponent();
-        AttachedToVisualTree += (_, _) =>
-        {
-            // 閬嶅巻瑙嗚鏍戣缃儗鏅
-            foreach (var v in this.GetVisualDescendants())
-            {
-                if (v is Border 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") tb.Foreground = ThemeHelper.HeaderText;
-                    else if (tb.Name == "SubtitleText") tb.Foreground = ThemeHelper.HeaderSubtext;
-                }
-            }
-            ThemeHelper.ThemeChanged += ApplyTheme;
-        };
-        DetachedFromVisualTree += (_, _) => ThemeHelper.ThemeChanged -= ApplyTheme;
-    }
-
-    private void ApplyTheme()
-    {
-        foreach (var v in this.GetVisualDescendants())
-        {
-            if (v is Border 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") tb.Foreground = ThemeHelper.HeaderText;
-                else if (tb.Name == "SubtitleText") tb.Foreground = ThemeHelper.HeaderSubtext;
-            }
-        }
     }
 }

+ 16 - 16
src/YZWater.Avalonia/Views/ViewBView.axaml

@@ -8,16 +8,16 @@
         <vm:ViewBViewModel/>
     </UserControl.DataContext>
 
-    <Border x:Name="RootBorder" Background="#0A0E14">
+    <Border x:Name="RootBorder" Background="{DynamicResource AppBgBrush}">
         <Grid RowDefinitions="48,*,32">
             <!-- 椤堕儴 -->
-            <Border x:Name="TitleBar" Grid.Row="0" Background="#111820" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,0,1">
+            <Border x:Name="TitleBar" Grid.Row="0" Background="{DynamicResource HeaderBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,0,1">
                 <Grid Margin="16,0">
                     <StackPanel Orientation="Horizontal" Spacing="12" VerticalAlignment="Center">
                         <Border Background="{DynamicResource InfoBrush}" Width="3" Height="20" CornerRadius="1"/>
                         <TextBlock x:Name="TitleText" Text="{Binding TitleText}" FontFamily="{DynamicResource MonoFont}" FontSize="16" FontWeight="Bold"
                                    Foreground="{DynamicResource TextPrimaryBrush}" VerticalAlignment="Center"/>
-                        <TextBlock x:Name="SubtitleText" Text="{Binding SubtitleText}" FontSize="12" Foreground="#9CA3AF" VerticalAlignment="Center"/>
+                        <TextBlock x:Name="SubtitleText" Text="{Binding SubtitleText}" FontSize="12" Foreground="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
                     </StackPanel>
                 </Grid>
             </Border>
@@ -36,16 +36,16 @@
                                            Foreground="{DynamicResource TextSecondaryBrush}"/>
                             </StackPanel>
                             <Grid ColumnDefinitions="100,*" RowDefinitions="Auto,Auto,Auto,Auto" Margin="4,0">
-                                <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding IpAddressText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="#9CA3AF" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding IpAddressText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
                                 <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding PlcIp}" Margin="0,4"/>
 
-                                <TextBlock Grid.Row="1" Grid.Column="0" Text="{Binding PortText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="#9CA3AF" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Row="1" Grid.Column="0" Text="{Binding PortText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
                                 <NumericUpDown Grid.Row="1" Grid.Column="1" Value="{Binding PlcPort}" Minimum="1" Maximum="65535" Margin="0,4"/>
 
-                                <TextBlock Grid.Row="2" Grid.Column="0" Text="{Binding AutoConnectText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="#9CA3AF" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Row="2" Grid.Column="0" Text="{Binding AutoConnectText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
                                 <CheckBox Grid.Row="2" Grid.Column="1" IsChecked="{Binding AutoConnect}" Margin="0,4"/>
 
-                                <TextBlock Grid.Row="3" Grid.Column="0" Text="{Binding StatusText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="#9CA3AF" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Row="3" Grid.Column="0" Text="{Binding StatusText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
                                 <StackPanel Grid.Row="3" Grid.Column="1" Orientation="Horizontal" Spacing="10" Margin="0,4">
                                     <TextBlock Text="{Binding ConnectionStatus}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextSecondaryBrush}" VerticalAlignment="Center"/>
                                     <Button Content="{Binding TestText}" Command="{Binding TestConnectionCommand}" Classes="btn-info"
@@ -65,17 +65,17 @@
                                            Foreground="{DynamicResource TextSecondaryBrush}"/>
                             </StackPanel>
                             <Grid ColumnDefinitions="120,*,60" RowDefinitions="Auto,Auto,Auto" Margin="4,0">
-                                <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding LevelHighText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="#9CA3AF" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding LevelHighText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
                                 <NumericUpDown Grid.Row="0" Grid.Column="1" Value="{Binding LevelHighAlarm}" Minimum="0" Maximum="100" FormatString="F1" Margin="0,4"/>
-                                <TextBlock Grid.Row="0" Grid.Column="2" Text="%" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="#9CA3AF" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Row="0" Grid.Column="2" Text="%" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
 
-                                <TextBlock Grid.Row="1" Grid.Column="0" Text="{Binding LevelLowText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="#9CA3AF" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Row="1" Grid.Column="0" Text="{Binding LevelLowText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
                                 <NumericUpDown Grid.Row="1" Grid.Column="1" Value="{Binding LevelLowAlarm}" Minimum="0" Maximum="100" FormatString="F1" Margin="0,4"/>
-                                <TextBlock Grid.Row="1" Grid.Column="2" Text="%" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="#9CA3AF" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Row="1" Grid.Column="2" Text="%" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
 
-                                <TextBlock Grid.Row="2" Grid.Column="0" Text="{Binding FlowHighText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="#9CA3AF" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Row="2" Grid.Column="0" Text="{Binding FlowHighText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
                                 <NumericUpDown Grid.Row="2" Grid.Column="1" Value="{Binding FlowHighAlarm}" Minimum="0" Maximum="1000" FormatString="F1" Margin="0,4"/>
-                                <TextBlock Grid.Row="2" Grid.Column="2" Text="m鲁/h" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="#9CA3AF" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Row="2" Grid.Column="2" Text="m鲁/h" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
                             </Grid>
                         </StackPanel>
                     </Border>
@@ -90,9 +90,9 @@
                                            Foreground="{DynamicResource TextSecondaryBrush}"/>
                             </StackPanel>
                             <Grid ColumnDefinitions="120,*,60" Margin="4,0">
-                                <TextBlock Grid.Column="0" Text="{Binding FrequencyText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="#9CA3AF" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Column="0" Text="{Binding FrequencyText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
                                 <NumericUpDown Grid.Column="1" Value="{Binding PumpFrequency}" Minimum="0" Maximum="100" FormatString="F1" Margin="0,4"/>
-                                <TextBlock Grid.Column="2" Text="Hz" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="#9CA3AF" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Column="2" Text="Hz" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
                             </Grid>
                         </StackPanel>
                     </Border>
@@ -113,7 +113,7 @@
             </ScrollViewer>
 
             <!-- 搴曢儴鐘舵佹爮 -->
-            <Border x:Name="StatusBar" Grid.Row="2" Background="#111820" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,1,0,0">
+            <Border x:Name="StatusBar" Grid.Row="2" Background="{DynamicResource NavBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,1,0,0">
                 <TextBlock Text="v3.0" FontFamily="{DynamicResource MonoFont}" FontSize="10"
                            Foreground="{DynamicResource TextDisabledBrush}" VerticalAlignment="Center" Margin="16,0"/>
             </Border>

+ 0 - 40
src/YZWater.Avalonia/Views/ViewBView.axaml.cs

@@ -1,6 +1,4 @@
 using Avalonia.Controls;
-using Avalonia.VisualTree;
-using YZWater.Avalonia.Controls;
 
 namespace YZWater.Avalonia.Views;
 
@@ -9,43 +7,5 @@ public partial class ViewBView : UserControl
     public ViewBView()
     {
         InitializeComponent();
-        AttachedToVisualTree += (_, _) =>
-        {
-            // 閬嶅巻瑙嗚鏍戣缃儗鏅
-            foreach (var v in this.GetVisualDescendants())
-            {
-                if (v is Border 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") tb.Foreground = ThemeHelper.HeaderText;
-                    else if (tb.Name == "SubtitleText") tb.Foreground = ThemeHelper.HeaderSubtext;
-                }
-            }
-            ThemeHelper.ThemeChanged += ApplyTheme;
-        };
-        DetachedFromVisualTree += (_, _) => ThemeHelper.ThemeChanged -= ApplyTheme;
-    }
-
-    private void ApplyTheme()
-    {
-        foreach (var v in this.GetVisualDescendants())
-        {
-            if (v is Border 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") tb.Foreground = ThemeHelper.HeaderText;
-                else if (tb.Name == "SubtitleText") tb.Foreground = ThemeHelper.HeaderSubtext;
-            }
-        }
     }
 }

+ 6 - 6
src/YZWater.Avalonia/Views/ViewCView.axaml

@@ -9,16 +9,16 @@
         <vm:ViewCViewModel/>
     </UserControl.DataContext>
 
-    <Border x:Name="RootBorder" Background="#0A0E14">
+    <Border x:Name="RootBorder" Background="{DynamicResource AppBgBrush}">
         <Grid RowDefinitions="48,*,32">
             <!-- 椤堕儴 -->
-            <Border x:Name="TitleBar" Grid.Row="0" Background="#111820" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,0,1">
+            <Border x:Name="TitleBar" Grid.Row="0" Background="{DynamicResource HeaderBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,0,1">
                 <Grid Margin="16,0">
                     <StackPanel Orientation="Horizontal" Spacing="12" VerticalAlignment="Center">
                         <Border Background="{DynamicResource SuccessBrush}" Width="3" Height="20" CornerRadius="1"/>
                         <TextBlock x:Name="TitleText" Text="{Binding TitleText}" FontFamily="{DynamicResource MonoFont}" FontSize="16" FontWeight="Bold"
                                    Foreground="{DynamicResource TextPrimaryBrush}" VerticalAlignment="Center"/>
-                        <TextBlock x:Name="SubtitleText" Text="{Binding SubtitleText}" FontSize="12" Foreground="#9CA3AF" VerticalAlignment="Center"/>
+                        <TextBlock x:Name="SubtitleText" Text="{Binding SubtitleText}" FontSize="12" Foreground="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
                     </StackPanel>
                 </Grid>
             </Border>
@@ -31,11 +31,11 @@
                         BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1" Padding="12" Margin="0,0,0,4">
                     <StackPanel Orientation="Horizontal" Spacing="16">
                         <StackPanel Orientation="Horizontal" Spacing="6">
-                            <TextBlock Text="{Binding FromText}" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="#9CA3AF" VerticalAlignment="Center"/>
+                            <TextBlock Text="{Binding FromText}" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
                             <DatePicker SelectedDate="{Binding StartDate}" Width="150"/>
                         </StackPanel>
                         <StackPanel Orientation="Horizontal" Spacing="6">
-                            <TextBlock Text="{Binding ToText}" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="#9CA3AF" VerticalAlignment="Center"/>
+                            <TextBlock Text="{Binding ToText}" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
                             <DatePicker SelectedDate="{Binding EndDate}" Width="150"/>
                         </StackPanel>
                         <Button Content="{Binding QueryText}" Command="{Binding LoadFlowRecordsCommand}" Classes="btn-info"/>
@@ -80,7 +80,7 @@
             </Grid>
 
             <!-- 搴曢儴 -->
-            <Border x:Name="StatusBar" Grid.Row="2" Background="#111820" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,1,0,0">
+            <Border x:Name="StatusBar" Grid.Row="2" Background="{DynamicResource NavBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,1,0,0">
                 <TextBlock Text="v3.0" FontFamily="{DynamicResource MonoFont}" FontSize="10"
                            Foreground="{DynamicResource TextDisabledBrush}" VerticalAlignment="Center" Margin="16,0"/>
             </Border>

+ 0 - 40
src/YZWater.Avalonia/Views/ViewCView.axaml.cs

@@ -1,6 +1,4 @@
 using Avalonia.Controls;
-using Avalonia.VisualTree;
-using YZWater.Avalonia.Controls;
 
 namespace YZWater.Avalonia.Views;
 
@@ -9,43 +7,5 @@ public partial class ViewCView : UserControl
     public ViewCView()
     {
         InitializeComponent();
-        AttachedToVisualTree += (_, _) =>
-        {
-            // 閬嶅巻瑙嗚鏍戣缃儗鏅
-            foreach (var v in this.GetVisualDescendants())
-            {
-                if (v is Border 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") tb.Foreground = ThemeHelper.HeaderText;
-                    else if (tb.Name == "SubtitleText") tb.Foreground = ThemeHelper.HeaderSubtext;
-                }
-            }
-            ThemeHelper.ThemeChanged += ApplyTheme;
-        };
-        DetachedFromVisualTree += (_, _) => ThemeHelper.ThemeChanged -= ApplyTheme;
-    }
-
-    private void ApplyTheme()
-    {
-        foreach (var v in this.GetVisualDescendants())
-        {
-            if (v is Border 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") tb.Foreground = ThemeHelper.HeaderText;
-                else if (tb.Name == "SubtitleText") tb.Foreground = ThemeHelper.HeaderSubtext;
-            }
-        }
     }
 }

+ 6 - 6
src/YZWater.Avalonia/Views/ViewDView.axaml

@@ -8,16 +8,16 @@
         <vm:ViewDViewModel/>
     </UserControl.DataContext>
 
-    <Border x:Name="RootBorder" Background="#0A0E14">
+    <Border x:Name="RootBorder" Background="{DynamicResource AppBgBrush}">
         <Grid RowDefinitions="48,*,32">
             <!-- 椤堕儴 -->
-            <Border x:Name="TitleBar" Grid.Row="0" Background="#111820" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,0,1">
+            <Border x:Name="TitleBar" Grid.Row="0" Background="{DynamicResource HeaderBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,0,1">
                 <Grid Margin="16,0">
                     <StackPanel Orientation="Horizontal" Spacing="12" VerticalAlignment="Center">
                         <Border Background="{DynamicResource DangerBrush}" Width="3" Height="20" CornerRadius="1"/>
                         <TextBlock x:Name="TitleText" Text="{Binding TitleText}" FontFamily="{DynamicResource MonoFont}" FontSize="16" FontWeight="Bold"
                                    Foreground="{DynamicResource TextPrimaryBrush}" VerticalAlignment="Center"/>
-                        <TextBlock x:Name="SubtitleText" Text="{Binding SubtitleText}" FontSize="12" Foreground="#9CA3AF" VerticalAlignment="Center"/>
+                        <TextBlock x:Name="SubtitleText" Text="{Binding SubtitleText}" FontSize="12" Foreground="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
                         <Border Background="{DynamicResource DangerBrush}" CornerRadius="10" Padding="8,2" Margin="8,0,0,0">
                             <TextBlock Text="{Binding UnconfirmedCount, StringFormat='{}{0}'}" FontFamily="{DynamicResource MonoFont}" FontSize="11"
                                        Foreground="White"/>
@@ -34,11 +34,11 @@
                         BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1" Padding="12" Margin="0,0,0,4">
                     <StackPanel Orientation="Horizontal" Spacing="16">
                         <StackPanel Orientation="Horizontal" Spacing="6">
-                            <TextBlock Text="{Binding FromText}" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="#9CA3AF" VerticalAlignment="Center"/>
+                            <TextBlock Text="{Binding FromText}" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
                             <DatePicker SelectedDate="{Binding StartDate}" Width="150"/>
                         </StackPanel>
                         <StackPanel Orientation="Horizontal" Spacing="6">
-                            <TextBlock Text="{Binding ToText}" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="#9CA3AF" VerticalAlignment="Center"/>
+                            <TextBlock Text="{Binding ToText}" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
                             <DatePicker SelectedDate="{Binding EndDate}" Width="150"/>
                         </StackPanel>
                         <Button Content="{Binding QueryText}" Command="{Binding LoadAlarmRecordsCommand}" Classes="btn-info"/>
@@ -91,7 +91,7 @@
             </Grid>
 
             <!-- 搴曢儴 -->
-            <Border x:Name="StatusBar" Grid.Row="2" Background="#111820" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,1,0,0">
+            <Border x:Name="StatusBar" Grid.Row="2" Background="{DynamicResource NavBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,1,0,0">
                 <TextBlock Text="v3.0" FontFamily="{DynamicResource MonoFont}" FontSize="10"
                            Foreground="{DynamicResource TextDisabledBrush}" VerticalAlignment="Center" Margin="16,0"/>
             </Border>

+ 0 - 40
src/YZWater.Avalonia/Views/ViewDView.axaml.cs

@@ -1,6 +1,4 @@
 using Avalonia.Controls;
-using Avalonia.VisualTree;
-using YZWater.Avalonia.Controls;
 
 namespace YZWater.Avalonia.Views;
 
@@ -9,43 +7,5 @@ public partial class ViewDView : UserControl
     public ViewDView()
     {
         InitializeComponent();
-        AttachedToVisualTree += (_, _) =>
-        {
-            // 閬嶅巻瑙嗚鏍戣缃儗鏅
-            foreach (var v in this.GetVisualDescendants())
-            {
-                if (v is Border 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") tb.Foreground = ThemeHelper.HeaderText;
-                    else if (tb.Name == "SubtitleText") tb.Foreground = ThemeHelper.HeaderSubtext;
-                }
-            }
-            ThemeHelper.ThemeChanged += ApplyTheme;
-        };
-        DetachedFromVisualTree += (_, _) => ThemeHelper.ThemeChanged -= ApplyTheme;
-    }
-
-    private void ApplyTheme()
-    {
-        foreach (var v in this.GetVisualDescendants())
-        {
-            if (v is Border 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") tb.Foreground = ThemeHelper.HeaderText;
-                else if (tb.Name == "SubtitleText") tb.Foreground = ThemeHelper.HeaderSubtext;
-            }
-        }
     }
 }

+ 4 - 4
src/YZWater.Avalonia/Views/ViewEView.axaml

@@ -8,16 +8,16 @@
         <vm:ViewEViewModel/>
     </UserControl.DataContext>
 
-    <Border x:Name="RootBorder" Background="#0A0E14">
+    <Border x:Name="RootBorder" Background="{DynamicResource AppBgBrush}">
         <Grid RowDefinitions="48,*,32">
             <!-- 椤堕儴 -->
-            <Border x:Name="TitleBar" Grid.Row="0" Background="#111820" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,0,1">
+            <Border x:Name="TitleBar" Grid.Row="0" Background="{DynamicResource HeaderBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,0,1">
                 <Grid Margin="16,0">
                     <StackPanel Orientation="Horizontal" Spacing="12" VerticalAlignment="Center">
                         <Border Background="{DynamicResource TextSecondaryBrush}" Width="3" Height="20" CornerRadius="1"/>
                         <TextBlock x:Name="TitleText" Text="{Binding TitleText}" FontFamily="{DynamicResource MonoFont}" FontSize="16" FontWeight="Bold"
                                    Foreground="{DynamicResource TextPrimaryBrush}" VerticalAlignment="Center"/>
-                        <TextBlock x:Name="SubtitleText" Text="{Binding SubtitleText}" FontSize="12" Foreground="#9CA3AF" VerticalAlignment="Center"/>
+                        <TextBlock x:Name="SubtitleText" Text="{Binding SubtitleText}" FontSize="12" Foreground="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
                     </StackPanel>
                 </Grid>
             </Border>
@@ -96,7 +96,7 @@
             </ScrollViewer>
 
             <!-- 搴曢儴 -->
-            <Border x:Name="StatusBar" Grid.Row="2" Background="#111820" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,1,0,0">
+            <Border x:Name="StatusBar" Grid.Row="2" Background="{DynamicResource NavBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,1,0,0">
                 <TextBlock Text="v3.0" FontFamily="{DynamicResource MonoFont}" FontSize="10"
                            Foreground="{DynamicResource TextDisabledBrush}" VerticalAlignment="Center" Margin="16,0"/>
             </Border>

+ 0 - 40
src/YZWater.Avalonia/Views/ViewEView.axaml.cs

@@ -1,6 +1,4 @@
 using Avalonia.Controls;
-using Avalonia.VisualTree;
-using YZWater.Avalonia.Controls;
 
 namespace YZWater.Avalonia.Views;
 
@@ -9,43 +7,5 @@ public partial class ViewEView : UserControl
     public ViewEView()
     {
         InitializeComponent();
-        AttachedToVisualTree += (_, _) =>
-        {
-            // 閬嶅巻瑙嗚鏍戣缃儗鏅
-            foreach (var v in this.GetVisualDescendants())
-            {
-                if (v is Border 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") tb.Foreground = ThemeHelper.HeaderText;
-                    else if (tb.Name == "SubtitleText") tb.Foreground = ThemeHelper.HeaderSubtext;
-                }
-            }
-            ThemeHelper.ThemeChanged += ApplyTheme;
-        };
-        DetachedFromVisualTree += (_, _) => ThemeHelper.ThemeChanged -= ApplyTheme;
-    }
-
-    private void ApplyTheme()
-    {
-        foreach (var v in this.GetVisualDescendants())
-        {
-            if (v is Border 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") tb.Foreground = ThemeHelper.HeaderText;
-                else if (tb.Name == "SubtitleText") tb.Foreground = ThemeHelper.HeaderSubtext;
-            }
-        }
     }
 }

+ 1 - 0
src/YZWater.Core/Services/ThemeService.cs

@@ -26,6 +26,7 @@ public partial class ThemeService : ObservableObject
     public void ToggleTheme()
     {
         IsDarkTheme = !IsDarkTheme;
+        Console.WriteLine($"[ThemeService] ToggleTheme: IsDarkTheme={IsDarkTheme}");
         ThemeChanged?.Invoke();
     }
 }