鐎忚浠g⒓

鏈缁堟柟妗 - 绾唬鐮佺粦瀹氫富棰橈紝涓嶄緷璧朌ynamicResource

纾 鏇 6 澶╀箣鍓
鐖剁瘈榛
鐣跺墠鎻愪氦
c03f5bbf46

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

@@ -10,7 +10,7 @@
         Width="1280" Height="800"
         MinWidth="1024" MinHeight="700"
         WindowStartupLocation="CenterScreen"
-        Background="{DynamicResource AppBgBrush}">
+        Background="#0A0E14">
 
     <Window.DataContext>
         <vm:MainViewModel/>
@@ -18,7 +18,7 @@
 
     <DockPanel>
         <!-- 鈺愨晲鈺 搴曢儴瀵艰埅鏍 鈺愨晲鈺 -->
-        <Border x:Name="NavBar" DockPanel.Dock="Bottom" Background="{DynamicResource NavBgBrush}"
+        <Border x:Name="NavBar" DockPanel.Dock="Bottom" Background="#111820"
                 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="{DynamicResource AppBgBrush}">
+        <TabControl SelectedIndex="{Binding SelectedTabIndex}" Background="#0A0E14">
             <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="{DynamicResource AppBgBrush}">
+    <Border x:Name="RootBorder" Background="#0A0E14">
         <Grid RowDefinitions="48,*,32">
 
             <!-- 鈺愨晲鈺 椤堕儴鏍囬鏍 鈺愨晲鈺 -->
-            <Border x:Name="TitleBar" Grid.Row="0" Background="{DynamicResource HeaderBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,0,1">
+            <Border x:Name="TitleBar" Grid.Row="0" Background="#111820" 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="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
+                                   Foreground="#9CA3AF" 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="{DynamicResource NavBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,1,0,0">
+            <Border x:Name="StatusBar" Grid.Row="2" Background="#111820" 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}">

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

@@ -1,4 +1,6 @@
 using Avalonia.Controls;
+using Avalonia.VisualTree;
+using YZWater.Avalonia.Controls;
 
 namespace YZWater.Avalonia.Views;
 
@@ -7,5 +9,43 @@ 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="{DynamicResource AppBgBrush}">
+    <Border x:Name="RootBorder" Background="#0A0E14">
         <Grid RowDefinitions="48,*,32">
             <!-- 椤堕儴 -->
-            <Border x:Name="TitleBar" Grid.Row="0" Background="{DynamicResource HeaderBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,0,1">
+            <Border x:Name="TitleBar" Grid.Row="0" Background="#111820" 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="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
+                        <TextBlock x:Name="SubtitleText" Text="{Binding SubtitleText}" FontSize="12" Foreground="#9CA3AF" 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="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding IpAddressText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="#9CA3AF" 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="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Row="1" Grid.Column="0" Text="{Binding PortText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="#9CA3AF" 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="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Row="2" Grid.Column="0" Text="{Binding AutoConnectText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="#9CA3AF" 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="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Row="3" Grid.Column="0" Text="{Binding StatusText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="#9CA3AF" 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="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding LevelHighText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="#9CA3AF" 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="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Row="0" Grid.Column="2" Text="%" 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"/>
+                                <TextBlock Grid.Row="1" Grid.Column="0" Text="{Binding LevelLowText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="#9CA3AF" 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="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Row="1" Grid.Column="2" Text="%" 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"/>
+                                <TextBlock Grid.Row="2" Grid.Column="0" Text="{Binding FlowHighText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="#9CA3AF" 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="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Row="2" Grid.Column="2" Text="m鲁/h" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="#9CA3AF" 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="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Column="0" Text="{Binding FrequencyText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="#9CA3AF" 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="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Column="2" Text="Hz" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="#9CA3AF" VerticalAlignment="Center"/>
                             </Grid>
                         </StackPanel>
                     </Border>
@@ -113,7 +113,7 @@
             </ScrollViewer>
 
             <!-- 搴曢儴鐘舵佹爮 -->
-            <Border x:Name="StatusBar" Grid.Row="2" Background="{DynamicResource NavBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,1,0,0">
+            <Border x:Name="StatusBar" Grid.Row="2" Background="#111820" 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>

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

@@ -1,4 +1,6 @@
 using Avalonia.Controls;
+using Avalonia.VisualTree;
+using YZWater.Avalonia.Controls;
 
 namespace YZWater.Avalonia.Views;
 
@@ -7,5 +9,43 @@ 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="{DynamicResource AppBgBrush}">
+    <Border x:Name="RootBorder" Background="#0A0E14">
         <Grid RowDefinitions="48,*,32">
             <!-- 椤堕儴 -->
-            <Border x:Name="TitleBar" Grid.Row="0" Background="{DynamicResource HeaderBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,0,1">
+            <Border x:Name="TitleBar" Grid.Row="0" Background="#111820" 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="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
+                        <TextBlock x:Name="SubtitleText" Text="{Binding SubtitleText}" FontSize="12" Foreground="#9CA3AF" 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="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
+                            <TextBlock Text="{Binding FromText}" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="#9CA3AF" VerticalAlignment="Center"/>
                             <DatePicker SelectedDate="{Binding StartDate}" Width="150"/>
                         </StackPanel>
                         <StackPanel Orientation="Horizontal" Spacing="6">
-                            <TextBlock Text="{Binding ToText}" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
+                            <TextBlock Text="{Binding ToText}" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="#9CA3AF" 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="{DynamicResource NavBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,1,0,0">
+            <Border x:Name="StatusBar" Grid.Row="2" Background="#111820" 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>

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

@@ -1,4 +1,6 @@
 using Avalonia.Controls;
+using Avalonia.VisualTree;
+using YZWater.Avalonia.Controls;
 
 namespace YZWater.Avalonia.Views;
 
@@ -7,5 +9,43 @@ 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="{DynamicResource AppBgBrush}">
+    <Border x:Name="RootBorder" Background="#0A0E14">
         <Grid RowDefinitions="48,*,32">
             <!-- 椤堕儴 -->
-            <Border x:Name="TitleBar" Grid.Row="0" Background="{DynamicResource HeaderBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,0,1">
+            <Border x:Name="TitleBar" Grid.Row="0" Background="#111820" 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="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
+                        <TextBlock x:Name="SubtitleText" Text="{Binding SubtitleText}" FontSize="12" Foreground="#9CA3AF" 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="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
+                            <TextBlock Text="{Binding FromText}" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="#9CA3AF" VerticalAlignment="Center"/>
                             <DatePicker SelectedDate="{Binding StartDate}" Width="150"/>
                         </StackPanel>
                         <StackPanel Orientation="Horizontal" Spacing="6">
-                            <TextBlock Text="{Binding ToText}" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
+                            <TextBlock Text="{Binding ToText}" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="#9CA3AF" 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="{DynamicResource NavBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,1,0,0">
+            <Border x:Name="StatusBar" Grid.Row="2" Background="#111820" 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>

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

@@ -1,4 +1,6 @@
 using Avalonia.Controls;
+using Avalonia.VisualTree;
+using YZWater.Avalonia.Controls;
 
 namespace YZWater.Avalonia.Views;
 
@@ -7,5 +9,43 @@ 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="{DynamicResource AppBgBrush}">
+    <Border x:Name="RootBorder" Background="#0A0E14">
         <Grid RowDefinitions="48,*,32">
             <!-- 椤堕儴 -->
-            <Border x:Name="TitleBar" Grid.Row="0" Background="{DynamicResource HeaderBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,0,1">
+            <Border x:Name="TitleBar" Grid.Row="0" Background="#111820" 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="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
+                        <TextBlock x:Name="SubtitleText" Text="{Binding SubtitleText}" FontSize="12" Foreground="#9CA3AF" VerticalAlignment="Center"/>
                     </StackPanel>
                 </Grid>
             </Border>
@@ -96,7 +96,7 @@
             </ScrollViewer>
 
             <!-- 搴曢儴 -->
-            <Border x:Name="StatusBar" Grid.Row="2" Background="{DynamicResource NavBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,1,0,0">
+            <Border x:Name="StatusBar" Grid.Row="2" Background="#111820" 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>

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

@@ -1,4 +1,6 @@
 using Avalonia.Controls;
+using Avalonia.VisualTree;
+using YZWater.Avalonia.Controls;
 
 namespace YZWater.Avalonia.Views;
 
@@ -7,5 +9,43 @@ 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;
+            }
+        }
     }
 }