袩褉芯褋屑芯褌褉 懈褋褏芯写薪芯谐芯 泻芯写邪

鏍囬鏍/瀵艰埅鏍/鍐呭鍖哄煙鍏ㄩ儴鏀圭敤浠g爜缁戝畾ThemeHelper锛岀‘淇濅富棰樺垏鎹㈠疄鏃剁敓鏁

纾 鏇 6 写薪械泄 薪邪蟹邪写
袪芯写懈褌械谢褜
小ommit
e6483ce247

+ 0 - 1
src/YZWater.Avalonia/App.axaml

@@ -11,7 +11,6 @@
     <Application.Resources>
         <ResourceDictionary>
             <ResourceDictionary.MergedDictionaries>
-                <!-- 榛樿鍔犺浇娣辫壊涓婚锛岃繍琛屾椂鍙垏鎹 -->
                 <ResourceInclude Source="Themes/IndustrialTheme.axaml"/>
             </ResourceDictionary.MergedDictionaries>
         </ResourceDictionary>

+ 52 - 0
src/YZWater.Avalonia/Controls/ThemeBrushBinding.cs

@@ -0,0 +1,52 @@
+using Avalonia.Controls;
+using Avalonia.Media;
+
+namespace YZWater.Avalonia.Controls;
+
+/// <summary>
+/// 甯姪瑙嗗浘璁㈤槄涓婚鍙樻洿骞舵洿鏂版爣棰樻爮
+/// </summary>
+public static class ThemeBrushBinding
+{
+    /// <summary>
+    /// 涓鸿鍥剧殑鏍囬鏍 Border 璁㈤槄涓婚鍙樻洿
+    /// </summary>
+    public static void BindTitleBar(Border titleBar)
+    {
+        void Update()
+        {
+            titleBar.Background = ThemeHelper.HeaderBg;
+        }
+
+        Update();
+        ThemeHelper.ThemeChanged += Update;
+    }
+
+    /// <summary>
+    /// 涓哄簳閮ㄧ姸鎬佹爮缁戝畾涓婚
+    /// </summary>
+    public static void BindStatusBar(Border statusBar)
+    {
+        void Update()
+        {
+            statusBar.Background = ThemeHelper.NavBg;
+        }
+
+        Update();
+        ThemeHelper.ThemeChanged += Update;
+    }
+
+    /// <summary>
+    /// 涓哄唴瀹瑰尯鍩熺粦瀹氫富棰
+    /// </summary>
+    public static void BindContent(Border content)
+    {
+        void Update()
+        {
+            content.Background = ThemeHelper.AppBg;
+        }
+
+        Update();
+        ThemeHelper.ThemeChanged += Update;
+    }
+}

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

@@ -3,13 +3,14 @@
         xmlns:vm="using:YZWater.Core.ViewModels"
         xmlns:views="using:YZWater.Avalonia.Views"
         xmlns:conv="using:YZWater.Avalonia.Converters"
+        xmlns:th="using:YZWater.Avalonia.Controls"
         x:Class="YZWater.Avalonia.Views.MainWindow"
         x:DataType="vm:MainViewModel"
         Title="{Binding Title}"
         Width="1280" Height="800"
         MinWidth="1024" MinHeight="700"
         WindowStartupLocation="CenterScreen"
-        Background="{DynamicResource AppBgBrush}">
+        Background="#0A0E14">
 
     <Window.DataContext>
         <vm:MainViewModel/>
@@ -17,7 +18,7 @@
 
     <DockPanel>
         <!-- 鈺愨晲鈺 搴曢儴瀵艰埅鏍 鈺愨晲鈺 -->
-        <Border 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">
                 <!-- 瀵艰埅鎸夐挳 -->

+ 14 - 0
src/YZWater.Avalonia/Views/MainWindow.axaml.cs

@@ -1,11 +1,25 @@
 using Avalonia.Controls;
+using Avalonia.Media;
+using YZWater.Avalonia.Controls;
+using YZWater.Core.Services;
 
 namespace YZWater.Avalonia.Views;
 
 public partial class MainWindow : Window
 {
+    private Border? _navBar;
+
     public MainWindow()
     {
         InitializeComponent();
+        _navBar = this.FindControl<Border>("NavBar");
+        ThemeHelper.ThemeChanged += OnThemeChanged;
+        OnThemeChanged();
+    }
+
+    private void OnThemeChanged()
+    {
+        Background = ThemeHelper.AppBg;
+        if (_navBar != null) _navBar.Background = ThemeHelper.NavBg;
     }
 }

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

@@ -13,15 +13,15 @@
         <Grid RowDefinitions="48,*,32">
 
             <!-- 鈺愨晲鈺 椤堕儴鏍囬鏍 鈺愨晲鈺 -->
-            <Border 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"/>
                         <TextBlock Text="{Binding TitleText}" FontSize="16" FontWeight="Bold"
                                    Foreground="{DynamicResource TextPrimaryBrush}" FontFamily="Consolas, monospace"
                                    VerticalAlignment="Center"/>
-                        <TextBlock Text="{Binding SubtitleText}" FontSize="12"
-                                   Foreground="{DynamicResource HeaderSubtextBrush}" VerticalAlignment="Center"/>
+                        <TextBlock x:Name="SubtitleText" Text="{Binding SubtitleText}" FontSize="12"
+                                   Foreground="#9CA3AF" VerticalAlignment="Center"/>
                     </StackPanel>
 
                     <StackPanel Grid.Column="2" Orientation="Horizontal" Spacing="8" VerticalAlignment="Center" Margin="24,0">
@@ -42,7 +42,7 @@
                                    Foreground="{DynamicResource SuccessBrush}"/>
                         <TextBlock Text="{Binding CurrentTime, StringFormat='{}{0:yyyy-MM-dd}'}"
                                    FontFamily="Consolas, monospace" FontSize="10"
-                                   Foreground="{DynamicResource HeaderSubtextBrush}" HorizontalAlignment="Right"/>
+                                   Foreground="#9CA3AF" HorizontalAlignment="Right"/>
                     </StackPanel>
                 </Grid>
             </Border>
@@ -193,7 +193,7 @@
                                 <!-- 鍙充晶锛氭暟鎹潰鏉 -->
                                 <Grid Grid.Row="0" Grid.RowSpan="4" Grid.Column="4" RowDefinitions="Auto,Auto,Auto" Margin="8,0,0,0">
                                     <!-- 妯″紡 -->
-                                    <Border Grid.Row="0" Background="{DynamicResource SurfaceBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1"
+                                    <Border x:Name="TitleBar" Grid.Row="0" Background="{DynamicResource SurfaceBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1"
                                             CornerRadius="2" Padding="8" Margin="0,0,0,6">
                                         <StackPanel HorizontalAlignment="Center" Spacing="4">
                                             <TextBlock Text="{Binding ModeText}" FontFamily="Consolas, monospace"
@@ -237,7 +237,7 @@
                                     </Border>
 
                                     <!-- 缁熻 -->
-                                    <Border Grid.Row="2" Background="{DynamicResource SurfaceBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1"
+                                    <Border x:Name="StatusBar" Grid.Row="2" Background="{DynamicResource SurfaceBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1"
                                             CornerRadius="2" Padding="8">
                                         <StackPanel Spacing="5">
                                             <TextBlock Text="{Binding StatisticsText}" FontFamily="Consolas, monospace"
@@ -267,7 +267,7 @@
                         </Border>
 
                         <!-- 搴曢儴璁惧鐘舵佹潯 -->
-                        <Border Grid.Row="2" Background="{DynamicResource SurfaceBgBrush}" CornerRadius="2" Margin="0,4,0,0" Padding="8,6">
+                        <Border x:Name="StatusBar" Grid.Row="2" Background="{DynamicResource SurfaceBgBrush}" CornerRadius="2" Margin="0,4,0,0" Padding="8,6">
                             <StackPanel Orientation="Horizontal" Spacing="12">
                                 <StackPanel Orientation="Horizontal" Spacing="4">
                                     <Border Width="8" Height="8" CornerRadius="4" Background="{Binding Pump1StatusColor}"/>
@@ -323,7 +323,7 @@
                 <!-- 鍙充晶闈㈡澘 -->
                 <Grid Grid.Column="1" RowDefinitions="Auto,Auto,*,Auto">
 
-                    <Border Grid.Row="0" Background="{DynamicResource SurfaceBgBrush}" CornerRadius="2" Padding="10,8" Margin="0,0,0,4"
+                    <Border x:Name="TitleBar" Grid.Row="0" Background="{DynamicResource SurfaceBgBrush}" CornerRadius="2" Padding="10,8" Margin="0,0,0,4"
                             BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1">
                         <StackPanel>
                             <StackPanel Orientation="Horizontal" Spacing="6" Margin="0,0,0,8">
@@ -358,7 +358,7 @@
                         </StackPanel>
                     </Border>
 
-                    <Border Grid.Row="2" Background="{DynamicResource SurfaceBgBrush}" CornerRadius="2" Padding="10,8" Margin="0,0,0,4"
+                    <Border x:Name="StatusBar" Grid.Row="2" Background="{DynamicResource SurfaceBgBrush}" CornerRadius="2" Padding="10,8" Margin="0,0,0,4"
                             BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1" IsVisible="{Binding HasAlarm}">
                         <StackPanel>
                             <StackPanel Orientation="Horizontal" Spacing="6" Margin="0,0,0,8">
@@ -400,7 +400,7 @@
             </Grid>
 
             <!-- 鈺愨晲鈺 搴曢儴鐘舵佹爮 鈺愨晲鈺 -->
-            <Border 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}">

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

@@ -1,4 +1,5 @@
 using Avalonia.Controls;
+using YZWater.Avalonia.Controls;
 
 namespace YZWater.Avalonia.Views;
 
@@ -7,5 +8,15 @@ public partial class ViewAView : UserControl
     public ViewAView()
     {
         InitializeComponent();
+        if (this.FindControl<Border>("TitleBar") is Border titleBar)
+            ThemeBrushBinding.BindTitleBar(titleBar);
+        if (this.FindControl<TextBlock>("TitleText") is TextBlock t)
+            ThemeHelper.ThemeChanged += () => t.Foreground = ThemeHelper.HeaderText;
+        if (this.FindControl<TextBlock>("SubtitleText") is TextBlock s)
+            ThemeHelper.ThemeChanged += () => s.Foreground = ThemeHelper.HeaderSubtext;
+        if (this.FindControl<Border>("StatusBar") is Border statusBar)
+            ThemeBrushBinding.BindStatusBar(statusBar);
+        if (this.FindControl<Border>("RootBorder") is Border root)
+            ThemeBrushBinding.BindContent(root);
     }
 }

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

@@ -11,13 +11,13 @@
     <Border Background="{DynamicResource AppBgBrush}">
         <Grid RowDefinitions="48,*,32">
             <!-- 椤堕儴 -->
-            <Border 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 Text="{Binding TitleText}" FontFamily="{DynamicResource MonoFont}" FontSize="16" FontWeight="Bold"
+                        <TextBlock x:Name="TitleText" Text="{Binding TitleText}" FontFamily="{DynamicResource MonoFont}" FontSize="16" FontWeight="Bold"
                                    Foreground="{DynamicResource TextPrimaryBrush}" VerticalAlignment="Center"/>
-                        <TextBlock 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 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>

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

@@ -1,4 +1,5 @@
 using Avalonia.Controls;
+using YZWater.Avalonia.Controls;
 
 namespace YZWater.Avalonia.Views;
 
@@ -7,5 +8,15 @@ public partial class ViewBView : UserControl
     public ViewBView()
     {
         InitializeComponent();
+        if (this.FindControl<Border>("TitleBar") is Border titleBar)
+            ThemeBrushBinding.BindTitleBar(titleBar);
+        if (this.FindControl<TextBlock>("TitleText") is TextBlock t)
+            ThemeHelper.ThemeChanged += () => t.Foreground = ThemeHelper.HeaderText;
+        if (this.FindControl<TextBlock>("SubtitleText") is TextBlock s)
+            ThemeHelper.ThemeChanged += () => s.Foreground = ThemeHelper.HeaderSubtext;
+        if (this.FindControl<Border>("StatusBar") is Border statusBar)
+            ThemeBrushBinding.BindStatusBar(statusBar);
+        if (this.FindControl<Border>("RootBorder") is Border root)
+            ThemeBrushBinding.BindContent(root);
     }
 }

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

@@ -12,13 +12,13 @@
     <Border Background="{DynamicResource AppBgBrush}">
         <Grid RowDefinitions="48,*,32">
             <!-- 椤堕儴 -->
-            <Border 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 Text="{Binding TitleText}" FontFamily="{DynamicResource MonoFont}" FontSize="16" FontWeight="Bold"
+                        <TextBlock x:Name="TitleText" Text="{Binding TitleText}" FontFamily="{DynamicResource MonoFont}" FontSize="16" FontWeight="Bold"
                                    Foreground="{DynamicResource TextPrimaryBrush}" VerticalAlignment="Center"/>
-                        <TextBlock 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>
@@ -27,15 +27,15 @@
             <Grid Grid.Row="1" RowDefinitions="Auto,*,Auto" Margin="8,4">
 
                 <!-- 鏌ヨ鏉′欢 -->
-                <Border Grid.Row="0" Background="{DynamicResource SurfaceBgBrush}" CornerRadius="2"
+                <Border x:Name="TitleBar" Grid.Row="0" Background="{DynamicResource SurfaceBgBrush}" CornerRadius="2"
                         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"/>
@@ -45,7 +45,7 @@
                 </Border>
 
                 <!-- 鍥捐〃 -->
-                <Border Grid.Row="0" Background="{DynamicResource SurfaceBgBrush}" CornerRadius="2"
+                <Border x:Name="TitleBar" Grid.Row="0" Background="{DynamicResource SurfaceBgBrush}" CornerRadius="2"
                         BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1" Padding="12" Margin="0,0,0,4">
                     <ScrollViewer>
                         <StackPanel>
@@ -80,7 +80,7 @@
             </Grid>
 
             <!-- 搴曢儴 -->
-            <Border 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>

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

@@ -1,4 +1,5 @@
 using Avalonia.Controls;
+using YZWater.Avalonia.Controls;
 
 namespace YZWater.Avalonia.Views;
 
@@ -7,5 +8,15 @@ public partial class ViewCView : UserControl
     public ViewCView()
     {
         InitializeComponent();
+        if (this.FindControl<Border>("TitleBar") is Border titleBar)
+            ThemeBrushBinding.BindTitleBar(titleBar);
+        if (this.FindControl<TextBlock>("TitleText") is TextBlock t)
+            ThemeHelper.ThemeChanged += () => t.Foreground = ThemeHelper.HeaderText;
+        if (this.FindControl<TextBlock>("SubtitleText") is TextBlock s)
+            ThemeHelper.ThemeChanged += () => s.Foreground = ThemeHelper.HeaderSubtext;
+        if (this.FindControl<Border>("StatusBar") is Border statusBar)
+            ThemeBrushBinding.BindStatusBar(statusBar);
+        if (this.FindControl<Border>("RootBorder") is Border root)
+            ThemeBrushBinding.BindContent(root);
     }
 }

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

@@ -11,13 +11,13 @@
     <Border Background="{DynamicResource AppBgBrush}">
         <Grid RowDefinitions="48,*,32">
             <!-- 椤堕儴 -->
-            <Border 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 Text="{Binding TitleText}" FontFamily="{DynamicResource MonoFont}" FontSize="16" FontWeight="Bold"
+                        <TextBlock x:Name="TitleText" Text="{Binding TitleText}" FontFamily="{DynamicResource MonoFont}" FontSize="16" FontWeight="Bold"
                                    Foreground="{DynamicResource TextPrimaryBrush}" VerticalAlignment="Center"/>
-                        <TextBlock 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"/>
@@ -30,15 +30,15 @@
             <Grid Grid.Row="1" RowDefinitions="Auto,*,Auto" Margin="8,4">
 
                 <!-- 鏌ヨ鏉′欢 -->
-                <Border Grid.Row="0" Background="{DynamicResource SurfaceBgBrush}" CornerRadius="2"
+                <Border x:Name="TitleBar" Grid.Row="0" Background="{DynamicResource SurfaceBgBrush}" CornerRadius="2"
                         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"/>
@@ -49,7 +49,7 @@
                 </Border>
 
                 <!-- 鎶ヨ鍒楄〃 -->
-                <Border Grid.Row="0" Background="{DynamicResource SurfaceBgBrush}" CornerRadius="2"
+                <Border x:Name="TitleBar" Grid.Row="0" Background="{DynamicResource SurfaceBgBrush}" CornerRadius="2"
                         BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1" Padding="8" Margin="0,0,0,4">
                     <DataGrid ItemsSource="{Binding AlarmRecords}" AutoGenerateColumns="False" IsReadOnly="True"
                               SelectedItem="{Binding SelectedRecord}">
@@ -91,7 +91,7 @@
             </Grid>
 
             <!-- 搴曢儴 -->
-            <Border 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>

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

@@ -1,4 +1,5 @@
 using Avalonia.Controls;
+using YZWater.Avalonia.Controls;
 
 namespace YZWater.Avalonia.Views;
 
@@ -7,5 +8,15 @@ public partial class ViewDView : UserControl
     public ViewDView()
     {
         InitializeComponent();
+        if (this.FindControl<Border>("TitleBar") is Border titleBar)
+            ThemeBrushBinding.BindTitleBar(titleBar);
+        if (this.FindControl<TextBlock>("TitleText") is TextBlock t)
+            ThemeHelper.ThemeChanged += () => t.Foreground = ThemeHelper.HeaderText;
+        if (this.FindControl<TextBlock>("SubtitleText") is TextBlock s)
+            ThemeHelper.ThemeChanged += () => s.Foreground = ThemeHelper.HeaderSubtext;
+        if (this.FindControl<Border>("StatusBar") is Border statusBar)
+            ThemeBrushBinding.BindStatusBar(statusBar);
+        if (this.FindControl<Border>("RootBorder") is Border root)
+            ThemeBrushBinding.BindContent(root);
     }
 }

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

@@ -11,13 +11,13 @@
     <Border Background="{DynamicResource AppBgBrush}">
         <Grid RowDefinitions="48,*,32">
             <!-- 椤堕儴 -->
-            <Border 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 Text="{Binding TitleText}" FontFamily="{DynamicResource MonoFont}" FontSize="16" FontWeight="Bold"
+                        <TextBlock x:Name="TitleText" Text="{Binding TitleText}" FontFamily="{DynamicResource MonoFont}" FontSize="16" FontWeight="Bold"
                                    Foreground="{DynamicResource TextPrimaryBrush}" VerticalAlignment="Center"/>
-                        <TextBlock 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 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>

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

@@ -1,4 +1,5 @@
 using Avalonia.Controls;
+using YZWater.Avalonia.Controls;
 
 namespace YZWater.Avalonia.Views;
 
@@ -7,5 +8,15 @@ public partial class ViewEView : UserControl
     public ViewEView()
     {
         InitializeComponent();
+        if (this.FindControl<Border>("TitleBar") is Border titleBar)
+            ThemeBrushBinding.BindTitleBar(titleBar);
+        if (this.FindControl<TextBlock>("TitleText") is TextBlock t)
+            ThemeHelper.ThemeChanged += () => t.Foreground = ThemeHelper.HeaderText;
+        if (this.FindControl<TextBlock>("SubtitleText") is TextBlock s)
+            ThemeHelper.ThemeChanged += () => s.Foreground = ThemeHelper.HeaderSubtext;
+        if (this.FindControl<Border>("StatusBar") is Border statusBar)
+            ThemeBrushBinding.BindStatusBar(statusBar);
+        if (this.FindControl<Border>("RootBorder") is Border root)
+            ThemeBrushBinding.BindContent(root);
     }
 }