第一版页面设计;实现主题切换;

This commit is contained in:
jackqqq123
2025-09-24 03:14:25 +08:00
parent 58d8d1f625
commit 6ec2a804ba
11 changed files with 971 additions and 11 deletions

View File

@@ -2,4 +2,63 @@
applyTo: '**' applyTo: '**'
--- ---
- 说中文 - 说中文
- 这是一个基于electron的项目管理工程目标是让非程序员也能轻松使用luban管理配置表。 - 这是一个基于Avalonia的项目管理工程目标是让非程序员也能轻松使用luban管理配置表。
## UI设计规范
### 🎨 主题兼容性
- **深色模式支持**: 所有UI元素必须在深色主题下清晰可见具有足够的对比度
- **浅色模式支持**: 所有UI元素必须在浅色主题下保持良好的可读性和视觉效果
- **动态主题切换**: 使用DynamicResource绑定支持运行时主题切换
- **颜色资源化**: 避免硬编码颜色值,统一使用主题资源字典中的颜色定义
### 🎯 交互状态设计
- **主要操作按钮**: 使用主题蓝色系,在两种模式下都要突出显示
- **成功/确认状态**: 使用绿色系,表示积极操作
- **警告状态**: 使用黄色系,提醒用户注意
- **错误/删除状态**: 使用红色系,表示危险操作
- **悬停和按下状态**: 提供清晰的视觉反馈,确保在两种主题下都有足够的对比度
### 📝 文字层级
- **主要文字**: 使用主题的主要文字颜色,确保最佳可读性
- **次要文字**: 使用稍浅的颜色,但仍保持良好的可读性
- **占位符文字**: 使用更浅的颜色,明确区分占位符和实际内容
- **禁用文字**: 使用最浅的颜色,明确表示不可用状态
### 🔘 圆角规范
- **按钮圆角**: `4px`
- **输入框圆角**: `4px`
- **卡片圆角**: `5px`
- **列表项圆角**: `3px`
### 📏 间距规范
- **小间距**: `5px`
- **标准间距**: `10px`
- **中等间距**: `15px`
- **大间距**: `20px`
- **页面边距**: `20px`
- **按钮内边距**: 水平`15px` 垂直`8px`
- **导航按钮内边距**: 水平`20px` 垂直`15px`
### 🎭 动画规范
- **过渡时间**: `0.2s` (200ms)
- **缓动函数**: `ease-out`
- **支持的过渡**: 背景色、前景色、透明度
### 📱 组件规范
- **导航栏宽度**: `200px`
- **最小窗口尺寸**: 宽度`1000px` 高度`600px`
- **设计尺寸**: 宽度`1200px` 高度`800px`
- **按钮最小高度**: `36px`
- **输入框最小高度**: `32px`
### 🎪 图标使用
- 使用Emoji作为图标: 📚📁📦📱⚙️🎮📊🔧🤖➕🔄📂🌐等
- 图标大小: 导航按钮中正常大小,卡片中`40px`
### 🖱️ 交互反馈
- 所有可点击元素必须有悬停状态
- 按钮支持按下状态反馈
- 输入框支持焦点状态
- 列表项支持选中和悬停状态
- 过渡动画让交互更流畅

17
design/页面设计.md Normal file
View File

@@ -0,0 +1,17 @@
这是我的应用主页设计,
左侧按钮依次为知识库、项目、安装
左侧最下方是设置按钮
- 点击知识库右侧内容区:
- 左侧,第一行为新建会话,下面是历史会话记录
- 右侧没有内容时显示问答窗口可以切换AI模型有内容时显示会话内容
- 点击项目管理右侧内容区:
- 顶部,导入项目、新建项目
- 下方,项目列表
- 点击安装鲁班右侧内容区:
- 顶部,添加本地版本,在线安装
- 下方,鲁班版本列表
- 点击设置,右侧内容区:
- 下载目录,用于存放下载资源
- 主体颜色,亮色、深色跟随系统

View File

@@ -6,5 +6,8 @@
<Application.Styles> <Application.Styles>
<FluentTheme /> <FluentTheme />
<!-- 引入自定义样式 -->
<StyleInclude Source="/Themes/Styles.axaml"/>
</Application.Styles> </Application.Styles>
</Application> </Application>

View File

@@ -1,6 +1,7 @@
using Avalonia; using Avalonia;
using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Markup.Xaml; using Avalonia.Markup.Xaml;
using System;
namespace LubanHub.App; namespace LubanHub.App;
@@ -8,16 +9,39 @@ public partial class App : Application
{ {
public override void Initialize() public override void Initialize()
{ {
try
{
Console.WriteLine("正在初始化应用程序...");
AvaloniaXamlLoader.Load(this); AvaloniaXamlLoader.Load(this);
Console.WriteLine("XAML加载完成。");
}
catch (Exception ex)
{
Console.WriteLine($"初始化时发生错误: {ex.Message}");
Console.WriteLine($"详细错误信息: {ex}");
throw;
}
} }
public override void OnFrameworkInitializationCompleted() public override void OnFrameworkInitializationCompleted()
{ {
try
{
Console.WriteLine("框架初始化完成,正在创建主窗口...");
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{ {
desktop.MainWindow = new MainWindow(); desktop.MainWindow = new MainWindow();
Console.WriteLine("主窗口已创建。");
} }
base.OnFrameworkInitializationCompleted(); base.OnFrameworkInitializationCompleted();
Console.WriteLine("应用程序启动完成。");
}
catch (Exception ex)
{
Console.WriteLine($"框架初始化完成时发生错误: {ex.Message}");
Console.WriteLine($"详细错误信息: {ex}");
throw;
}
} }
} }

View File

@@ -2,8 +2,262 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" mc:Ignorable="d" d:DesignWidth="1200" d:DesignHeight="800"
x:Class="LubanHub.App.MainWindow" x:Class="LubanHub.App.MainWindow"
Title="LubanHub"> Title="LubanHub"
Welcome to Avalonia! MinWidth="1000" MinHeight="600">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- 左侧导航栏 -->
<Border Grid.Column="0" Background="{DynamicResource SidebarBackgroundBrush}"
BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,1,0">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- 应用标题 -->
<TextBlock Grid.Row="0" Text="LubanHub"
Classes="subheader"
Margin="{DynamicResource LargeMargin}"
HorizontalAlignment="Center"/>
<!-- 导航按钮区域 -->
<StackPanel Grid.Row="1" Orientation="Vertical">
<Button Name="KnowledgeButton"
Content="📚 知识库"
Classes="navigation-button"
Click="OnKnowledgeButtonClick"/>
<Button Name="ProjectButton"
Content="📁 项目"
Classes="navigation-button"
Click="OnProjectButtonClick"/>
<Button Name="InstallButton"
Content="📦 安装"
Classes="navigation-button"
Click="OnInstallButtonClick"/>
</StackPanel>
<!-- 底部按钮区域 -->
<StackPanel Grid.Row="2" Orientation="Vertical">
<!-- 设置按钮 -->
<Button Name="SettingsButton"
Content="⚙️ 设置"
Classes="navigation-button"
Margin="{DynamicResource StandardMargin}"
Click="OnSettingsButtonClick"/>
</StackPanel>
</Grid>
</Border>
<!-- 右侧内容区域 -->
<Border Grid.Column="1" Background="{DynamicResource AppBackgroundBrush}">
<Grid>
<!-- 内容区域 -->
<Panel Name="ContentPanel">
<!-- 默认欢迎页面 -->
<StackPanel Name="WelcomePanel"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<TextBlock Text="欢迎使用 LubanHub"
Classes="header"
HorizontalAlignment="Center"
Margin="{DynamicResource LargeMargin}"/>
<TextBlock Text="请选择左侧菜单开始使用"
Classes="body"
Foreground="{DynamicResource SecondaryTextBrush}"
HorizontalAlignment="Center"/>
</StackPanel>
<!-- 知识库页面 -->
<Grid Name="KnowledgePanel" IsVisible="False">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="300"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- 左侧会话列表 -->
<Border Grid.Column="0" Background="{DynamicResource PanelBackgroundBrush}"
BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,1,0">
<StackPanel Margin="{DynamicResource StandardMargin}">
<Button Content="+ 新建会话"
Classes="primary"
Margin="{DynamicResource StandardMargin}"/>
<TextBlock Text="历史会话"
Classes="caption"
Margin="{DynamicResource StandardMargin}"/>
<ListBox Background="Transparent"
BorderThickness="0">
<ListBoxItem Content="会话 1"/>
<ListBoxItem Content="会话 2"/>
<ListBoxItem Content="会话 3"/>
</ListBox>
</StackPanel>
</Border>
<!-- 右侧聊天区域 -->
<Grid Grid.Column="1">
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Text="🤖 AI助手"
Classes="subheader"
HorizontalAlignment="Center"
Margin="{DynamicResource StandardMargin}"/>
<ComboBox SelectedIndex="0" Width="150" Margin="{DynamicResource LargeMargin}">
<ComboBoxItem Content="GPT-4"/>
<ComboBoxItem Content="Claude"/>
<ComboBoxItem Content="文心一言"/>
</ComboBox>
<TextBox Watermark="请输入您的问题..."
Width="400"
Height="100"
TextWrapping="Wrap"
AcceptsReturn="True"/>
<Button Content="发送"
Classes="primary"
Margin="{DynamicResource StandardMargin}"/>
</StackPanel>
</Grid>
</Grid>
<!-- 项目页面 -->
<Grid Name="ProjectPanel" IsVisible="False">
<StackPanel Margin="20">
<StackPanel Orientation="Horizontal" Margin="0,0,0,20">
<Button Content="📂 导入项目"
Background="#007ACC"
Foreground="White"
Margin="0,0,10,0"
Padding="10,5"/>
<Button Content=" 新建项目"
Background="#28A745"
Foreground="White"
Padding="10,5"/>
</StackPanel>
<TextBlock Text="项目列表"
Foreground="White"
FontSize="16"
Margin="0,0,0,10"/>
<ListBox Background="#252526"
BorderThickness="1"
BorderBrush="#3F3F46">
<ListBoxItem>
<StackPanel>
<TextBlock Text="示例项目 1" Foreground="White" FontWeight="Bold"/>
<TextBlock Text="项目描述..." Foreground="#CCCCCC" FontSize="12"/>
</StackPanel>
</ListBoxItem>
<ListBoxItem>
<StackPanel>
<TextBlock Text="示例项目 2" Foreground="White" FontWeight="Bold"/>
<TextBlock Text="项目描述..." Foreground="#CCCCCC" FontSize="12"/>
</StackPanel>
</ListBoxItem>
</ListBox>
</StackPanel>
</Grid>
<!-- 安装页面 -->
<Grid Name="InstallPanel" IsVisible="False">
<StackPanel Margin="20">
<StackPanel Orientation="Horizontal" Margin="0,0,0,20">
<Button Content="📁 添加本地版本"
Background="#007ACC"
Foreground="White"
Margin="0,0,10,0"
Padding="10,5"/>
<Button Content="🌐 在线安装"
Background="#28A745"
Foreground="White"
Padding="10,5"/>
</StackPanel>
<TextBlock Text="鲁班版本列表"
Foreground="White"
FontSize="16"
Margin="0,0,0,10"/>
<ListBox Background="#252526"
BorderThickness="1"
BorderBrush="#3F3F46">
<ListBoxItem>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Luban v2.1.0" Foreground="White" FontWeight="Bold" Width="150"/>
<TextBlock Text="已安装" Foreground="#28A745" Margin="10,0"/>
<Button Content="启动" Background="#007ACC" Foreground="White" Padding="5,2"/>
</StackPanel>
</ListBoxItem>
<ListBoxItem>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Luban v2.0.5" Foreground="White" FontWeight="Bold" Width="150"/>
<TextBlock Text="未安装" Foreground="#DC3545" Margin="10,0"/>
<Button Content="安装" Background="#28A745" Foreground="White" Padding="5,2"/>
</StackPanel>
</ListBoxItem>
</ListBox>
</StackPanel>
</Grid>
<!-- 设置页面 -->
<Grid Name="SettingsPanel" IsVisible="False">
<StackPanel Margin="{DynamicResource LargeMargin}">
<TextBlock Text="⚙️ 设置"
Classes="subheader"
Foreground="{DynamicResource PrimaryTextBrush}"
FontSize="20"
Margin="0,0,0,20"/>
<StackPanel Margin="0,0,0,20">
<TextBlock Text="下载目录"
Classes="title"
Foreground="{DynamicResource PrimaryTextBrush}"
FontSize="14"
Margin="0,0,0,5"/>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBox Grid.Column="0"
Text="C:\Users\Downloads\LubanHub"
Background="{DynamicResource InputBackgroundBrush}"
Foreground="{DynamicResource PrimaryTextBrush}"
BorderBrush="{DynamicResource BorderBrush}"
Margin="0,0,10,0"/>
<Button Grid.Column="1"
Content="浏览..."
Classes="primary"
Padding="{DynamicResource ButtonPadding}"/>
</Grid>
</StackPanel>
<StackPanel>
<TextBlock Text="主题设置"
Classes="title"
Foreground="{DynamicResource PrimaryTextBrush}"
FontSize="14"
Margin="0,0,0,5"/>
<ComboBox Name="ThemeComboBox"
SelectedIndex="0"
Width="200"
HorizontalAlignment="Left"
SelectionChanged="OnThemeComboBoxSelectionChanged">
<ComboBoxItem Content="深色主题"/>
<ComboBoxItem Content="浅色主题"/>
</ComboBox>
</StackPanel>
</StackPanel>
</Grid>
</Panel>
</Grid>
</Border>
</Grid>
</Window> </Window>

View File

@@ -1,11 +1,133 @@
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Controls.Selection;
using LubanHub.App.Services;
namespace LubanHub.App; namespace LubanHub.App;
public partial class MainWindow : Window public partial class MainWindow : Window
{ {
private Panel? _contentPanel;
private StackPanel? _welcomePanel;
private Grid? _knowledgePanel;
private Grid? _projectPanel;
private Grid? _installPanel;
private Grid? _settingsPanel;
private Button? _knowledgeButton;
private Button? _projectButton;
private Button? _installButton;
private Button? _settingsButton;
private ComboBox? _themeComboBox;
public MainWindow() public MainWindow()
{ {
InitializeComponent(); InitializeComponent();
InitializeComponents();
// 订阅主题变化事件
ThemeManager.ThemeChanged += OnThemeChanged;
// 初始化主题
ThemeManager.Initialize();
UpdateThemeComboBox();
}
private void InitializeComponents()
{
// 获取面板引用
_contentPanel = this.FindControl<Panel>("ContentPanel");
_welcomePanel = this.FindControl<StackPanel>("WelcomePanel");
_knowledgePanel = this.FindControl<Grid>("KnowledgePanel");
_projectPanel = this.FindControl<Grid>("ProjectPanel");
_installPanel = this.FindControl<Grid>("InstallPanel");
_settingsPanel = this.FindControl<Grid>("SettingsPanel");
// 获取按钮引用
_knowledgeButton = this.FindControl<Button>("KnowledgeButton");
_projectButton = this.FindControl<Button>("ProjectButton");
_installButton = this.FindControl<Button>("InstallButton");
_settingsButton = this.FindControl<Button>("SettingsButton");
_themeComboBox = this.FindControl<ComboBox>("ThemeComboBox");
}
private void ShowPanel(Grid? targetPanel)
{
// 隐藏所有面板
if (_welcomePanel != null) _welcomePanel.IsVisible = false;
if (_knowledgePanel != null) _knowledgePanel.IsVisible = false;
if (_projectPanel != null) _projectPanel.IsVisible = false;
if (_installPanel != null) _installPanel.IsVisible = false;
if (_settingsPanel != null) _settingsPanel.IsVisible = false;
// 显示目标面板
if (targetPanel != null)
{
targetPanel.IsVisible = true;
}
// 更新按钮样式
UpdateButtonStyles();
}
private void UpdateButtonStyles()
{
// 移除所有按钮的选中样式
_knowledgeButton?.Classes.Remove("selected");
_projectButton?.Classes.Remove("selected");
_installButton?.Classes.Remove("selected");
_settingsButton?.Classes.Remove("selected");
// 根据当前显示的面板添加选中样式
if (_knowledgePanel?.IsVisible == true)
_knowledgeButton?.Classes.Add("selected");
else if (_projectPanel?.IsVisible == true)
_projectButton?.Classes.Add("selected");
else if (_installPanel?.IsVisible == true)
_installButton?.Classes.Add("selected");
else if (_settingsPanel?.IsVisible == true)
_settingsButton?.Classes.Add("selected");
}
private void OnKnowledgeButtonClick(object? sender, RoutedEventArgs e)
{
ShowPanel(_knowledgePanel);
}
private void OnProjectButtonClick(object? sender, RoutedEventArgs e)
{
ShowPanel(_projectPanel);
}
private void OnInstallButtonClick(object? sender, RoutedEventArgs e)
{
ShowPanel(_installPanel);
}
private void OnSettingsButtonClick(object? sender, RoutedEventArgs e)
{
ShowPanel(_settingsPanel);
}
private void OnThemeComboBoxSelectionChanged(object? sender, SelectionChangedEventArgs e)
{
if (_themeComboBox?.SelectedIndex != null)
{
var newTheme = _themeComboBox.SelectedIndex == 0 ? ThemeVariant.Dark : ThemeVariant.Light;
ThemeManager.SetTheme(newTheme);
}
}
private void OnThemeChanged(ThemeVariant theme)
{
UpdateThemeComboBox();
}
private void UpdateThemeComboBox()
{
if (_themeComboBox != null)
{
_themeComboBox.SelectedIndex = ThemeManager.CurrentTheme == ThemeVariant.Dark ? 0 : 1;
}
} }
} }

View File

@@ -1,5 +1,6 @@
using Avalonia; using Avalonia;
using System; using System;
using System.Diagnostics;
namespace LubanHub.App; namespace LubanHub.App;
@@ -9,8 +10,24 @@ class Program
// SynchronizationContext-reliant code before AppMain is called: things aren't initialized // SynchronizationContext-reliant code before AppMain is called: things aren't initialized
// yet and stuff might break. // yet and stuff might break.
[STAThread] [STAThread]
public static void Main(string[] args) => BuildAvaloniaApp() public static void Main(string[] args)
.StartWithClassicDesktopLifetime(args); {
try
{
System.IO.File.WriteAllText("debug.log", "正在启动应用程序...\n");
var app = BuildAvaloniaApp();
System.IO.File.AppendAllText("debug.log", "AppBuilder创建完成正在启动...\n");
app.StartWithClassicDesktopLifetime(args);
System.IO.File.AppendAllText("debug.log", "应用程序启动完成。\n");
}
catch (Exception ex)
{
var errorMsg = $"启动应用程序时发生错误: {ex.Message}\n详细错误信息: {ex}\n";
System.IO.File.WriteAllText("error.log", errorMsg);
Console.WriteLine(errorMsg);
throw;
}
}
// Avalonia configuration, don't remove; also used by visual designer. // Avalonia configuration, don't remove; also used by visual designer.
public static AppBuilder BuildAvaloniaApp() public static AppBuilder BuildAvaloniaApp()

View File

@@ -0,0 +1,71 @@
using System;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
namespace LubanHub.App.Services
{
public enum ThemeVariant
{
Dark,
Light
}
public static class ThemeManager
{
private static ThemeVariant _currentTheme = ThemeVariant.Dark;
public static ThemeVariant CurrentTheme => _currentTheme;
public static event Action<ThemeVariant>? ThemeChanged;
public static void SetTheme(ThemeVariant theme)
{
if (_currentTheme == theme)
return;
_currentTheme = theme;
ApplyTheme(theme);
ThemeChanged?.Invoke(theme);
}
public static void ToggleTheme()
{
var newTheme = _currentTheme == ThemeVariant.Dark ? ThemeVariant.Light : ThemeVariant.Dark;
SetTheme(newTheme);
}
private static void ApplyTheme(ThemeVariant theme)
{
var app = Application.Current;
if (app?.Resources == null) return;
try
{
// 加载对应的主题资源字典
var themeFile = theme == ThemeVariant.Dark ? "DarkTheme.axaml" : "LightTheme.axaml";
var uri = new Uri($"avares://LubanHub.App/Themes/{themeFile}");
// 使用AvaloniaXamlLoader加载资源字典
var themeDict = AvaloniaXamlLoader.Load(uri) as ResourceDictionary;
if (themeDict != null)
{
// 清除现有的合并字典
app.Resources.MergedDictionaries.Clear();
// 添加新的主题字典
app.Resources.MergedDictionaries.Add(themeDict);
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"主题切换失败: {ex.Message}");
}
}
public static void Initialize()
{
// 初始化时应用默认主题
ApplyTheme(_currentTheme);
}
}
}

View File

@@ -0,0 +1,72 @@
<ResourceDictionary xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- 深色主题配色表 -->
<!-- 基础背景色 -->
<SolidColorBrush x:Key="AppBackgroundBrush">#1E1E1E</SolidColorBrush>
<SolidColorBrush x:Key="SidebarBackgroundBrush">#2D2D30</SolidColorBrush>
<SolidColorBrush x:Key="PanelBackgroundBrush">#252526</SolidColorBrush>
<SolidColorBrush x:Key="InputBackgroundBrush">#3C3C3C</SolidColorBrush>
<!-- 边框和分割线 -->
<SolidColorBrush x:Key="BorderBrush">#3F3F46</SolidColorBrush>
<SolidColorBrush x:Key="DividerBrush">#555555</SolidColorBrush>
<!-- 文字颜色 -->
<SolidColorBrush x:Key="PrimaryTextBrush">#FFFFFF</SolidColorBrush>
<SolidColorBrush x:Key="SecondaryTextBrush">#CCCCCC</SolidColorBrush>
<SolidColorBrush x:Key="PlaceholderTextBrush">#999999</SolidColorBrush>
<SolidColorBrush x:Key="DisabledTextBrush">#666666</SolidColorBrush>
<!-- 交互状态颜色 -->
<SolidColorBrush x:Key="PrimaryBrush">#007ACC</SolidColorBrush>
<SolidColorBrush x:Key="PrimaryHoverBrush">#1E8AD6</SolidColorBrush>
<SolidColorBrush x:Key="SuccessBrush">#28A745</SolidColorBrush>
<SolidColorBrush x:Key="WarningBrush">#FFC107</SolidColorBrush>
<SolidColorBrush x:Key="ErrorBrush">#DC3545</SolidColorBrush>
<SolidColorBrush x:Key="HoverBrush">#4A4A4A</SolidColorBrush>
<SolidColorBrush x:Key="PressedBrush">#5A5A5A</SolidColorBrush>
<!-- 导航相关 -->
<SolidColorBrush x:Key="NavigationBackgroundBrush">Transparent</SolidColorBrush>
<SolidColorBrush x:Key="NavigationTextBrush">#CCCCCC</SolidColorBrush>
<SolidColorBrush x:Key="NavigationHoverBrush">#4A4A4A</SolidColorBrush>
<SolidColorBrush x:Key="NavigationHoverTextBrush">#FFFFFF</SolidColorBrush>
<SolidColorBrush x:Key="NavigationSelectedBrush">#007ACC</SolidColorBrush>
<SolidColorBrush x:Key="NavigationSelectedHoverBrush">#1E8AD6</SolidColorBrush>
<!-- 列表和卡片 -->
<SolidColorBrush x:Key="ListItemHoverBrush">#4A4A4A</SolidColorBrush>
<SolidColorBrush x:Key="ListItemSelectedBrush">#007ACC</SolidColorBrush>
<SolidColorBrush x:Key="CardBackgroundBrush">#252526</SolidColorBrush>
<!-- 阴影和层级 -->
<SolidColorBrush x:Key="ShadowBrush">#000000</SolidColorBrush>
<SolidColorBrush x:Key="OverlayBrush">#80000000</SolidColorBrush>
<!-- 圆角值 -->
<CornerRadius x:Key="ButtonCornerRadius">4</CornerRadius>
<CornerRadius x:Key="InputCornerRadius">4</CornerRadius>
<CornerRadius x:Key="CardCornerRadius">5</CornerRadius>
<CornerRadius x:Key="ListItemCornerRadius">3</CornerRadius>
<!-- 间距值 -->
<Thickness x:Key="SmallMargin">5</Thickness>
<Thickness x:Key="StandardMargin">10</Thickness>
<Thickness x:Key="MediumMargin">15</Thickness>
<Thickness x:Key="LargeMargin">20</Thickness>
<Thickness x:Key="ButtonPadding">15,8</Thickness>
<Thickness x:Key="NavigationButtonPadding">20,15</Thickness>
<Thickness x:Key="InputPadding">8,6</Thickness>
<Thickness x:Key="ListItemPadding">12,8</Thickness>
<!-- 字体大小 -->
<x:Double x:Key="HeaderFontSize">24</x:Double>
<x:Double x:Key="SubHeaderFontSize">20</x:Double>
<x:Double x:Key="TitleFontSize">16</x:Double>
<x:Double x:Key="BodyFontSize">14</x:Double>
<x:Double x:Key="CaptionFontSize">12</x:Double>
<x:Double x:Key="IconFontSize">40</x:Double>
</ResourceDictionary>

View File

@@ -0,0 +1,72 @@
<ResourceDictionary xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- 浅色主题配色表 -->
<!-- 基础背景色 -->
<SolidColorBrush x:Key="AppBackgroundBrush">#FFFFFF</SolidColorBrush>
<SolidColorBrush x:Key="SidebarBackgroundBrush">#F8F9FA</SolidColorBrush>
<SolidColorBrush x:Key="PanelBackgroundBrush">#FFFFFF</SolidColorBrush>
<SolidColorBrush x:Key="InputBackgroundBrush">#FFFFFF</SolidColorBrush>
<!-- 边框和分割线 -->
<SolidColorBrush x:Key="BorderBrush">#E1E5E9</SolidColorBrush>
<SolidColorBrush x:Key="DividerBrush">#DEE2E6</SolidColorBrush>
<!-- 文字颜色 -->
<SolidColorBrush x:Key="PrimaryTextBrush">#212529</SolidColorBrush>
<SolidColorBrush x:Key="SecondaryTextBrush">#6C757D</SolidColorBrush>
<SolidColorBrush x:Key="PlaceholderTextBrush">#ADB5BD</SolidColorBrush>
<SolidColorBrush x:Key="DisabledTextBrush">#CED4DA</SolidColorBrush>
<!-- 交互状态颜色 -->
<SolidColorBrush x:Key="PrimaryBrush">#007ACC</SolidColorBrush>
<SolidColorBrush x:Key="PrimaryHoverBrush">#005A9B</SolidColorBrush>
<SolidColorBrush x:Key="SuccessBrush">#28A745</SolidColorBrush>
<SolidColorBrush x:Key="WarningBrush">#FFC107</SolidColorBrush>
<SolidColorBrush x:Key="ErrorBrush">#DC3545</SolidColorBrush>
<SolidColorBrush x:Key="HoverBrush">#F8F9FA</SolidColorBrush>
<SolidColorBrush x:Key="PressedBrush">#E9ECEF</SolidColorBrush>
<!-- 导航相关 -->
<SolidColorBrush x:Key="NavigationBackgroundBrush">Transparent</SolidColorBrush>
<SolidColorBrush x:Key="NavigationTextBrush">#6C757D</SolidColorBrush>
<SolidColorBrush x:Key="NavigationHoverBrush">#F8F9FA</SolidColorBrush>
<SolidColorBrush x:Key="NavigationHoverTextBrush">#212529</SolidColorBrush>
<SolidColorBrush x:Key="NavigationSelectedBrush">#007ACC</SolidColorBrush>
<SolidColorBrush x:Key="NavigationSelectedHoverBrush">#005A9B</SolidColorBrush>
<!-- 列表和卡片 -->
<SolidColorBrush x:Key="ListItemHoverBrush">#F8F9FA</SolidColorBrush>
<SolidColorBrush x:Key="ListItemSelectedBrush">#007ACC</SolidColorBrush>
<SolidColorBrush x:Key="CardBackgroundBrush">#FFFFFF</SolidColorBrush>
<!-- 阴影和层级 -->
<SolidColorBrush x:Key="ShadowBrush">#00000020</SolidColorBrush>
<SolidColorBrush x:Key="OverlayBrush">#80FFFFFF</SolidColorBrush>
<!-- 圆角值 -->
<CornerRadius x:Key="ButtonCornerRadius">4</CornerRadius>
<CornerRadius x:Key="InputCornerRadius">4</CornerRadius>
<CornerRadius x:Key="CardCornerRadius">5</CornerRadius>
<CornerRadius x:Key="ListItemCornerRadius">3</CornerRadius>
<!-- 间距值 -->
<Thickness x:Key="SmallMargin">5</Thickness>
<Thickness x:Key="StandardMargin">10</Thickness>
<Thickness x:Key="MediumMargin">15</Thickness>
<Thickness x:Key="LargeMargin">20</Thickness>
<Thickness x:Key="ButtonPadding">15,8</Thickness>
<Thickness x:Key="NavigationButtonPadding">20,15</Thickness>
<Thickness x:Key="InputPadding">8,6</Thickness>
<Thickness x:Key="ListItemPadding">12,8</Thickness>
<!-- 字体大小 -->
<x:Double x:Key="HeaderFontSize">24</x:Double>
<x:Double x:Key="SubHeaderFontSize">20</x:Double>
<x:Double x:Key="TitleFontSize">16</x:Double>
<x:Double x:Key="BodyFontSize">14</x:Double>
<x:Double x:Key="CaptionFontSize">12</x:Double>
<x:Double x:Key="IconFontSize">40</x:Double>
</ResourceDictionary>

View File

@@ -0,0 +1,249 @@
<Styles xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Styles.Resources>
<!-- 圆角值 -->
<CornerRadius x:Key="ButtonCornerRadius">4</CornerRadius>
<CornerRadius x:Key="InputCornerRadius">4</CornerRadius>
<CornerRadius x:Key="CardCornerRadius">5</CornerRadius>
<CornerRadius x:Key="ListItemCornerRadius">3</CornerRadius>
<!-- 间距值 -->
<Thickness x:Key="SmallMargin">5</Thickness>
<Thickness x:Key="StandardMargin">10</Thickness>
<Thickness x:Key="MediumMargin">15</Thickness>
<Thickness x:Key="LargeMargin">20</Thickness>
<Thickness x:Key="ButtonPadding">15,8</Thickness>
<Thickness x:Key="NavigationButtonPadding">20,15</Thickness>
<Thickness x:Key="InputPadding">8,6</Thickness>
<Thickness x:Key="ListItemPadding">12,8</Thickness>
<!-- 字体大小 -->
<x:Double x:Key="HeaderFontSize">24</x:Double>
<x:Double x:Key="SubHeaderFontSize">20</x:Double>
<x:Double x:Key="TitleFontSize">16</x:Double>
<x:Double x:Key="BodyFontSize">14</x:Double>
<x:Double x:Key="CaptionFontSize">12</x:Double>
<x:Double x:Key="IconFontSize">40</x:Double>
</Styles.Resources>
<!-- 导航按钮样式 -->
<Style Selector="Button.navigation-button">
<Setter Property="Background" Value="{DynamicResource NavigationBackgroundBrush}"/>
<Setter Property="Foreground" Value="{DynamicResource NavigationTextBrush}"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Padding" Value="{DynamicResource NavigationButtonPadding}"/>
<Setter Property="HorizontalAlignment" Value="Stretch"/>
<Setter Property="HorizontalContentAlignment" Value="Left"/>
<Setter Property="FontSize" Value="{DynamicResource BodyFontSize}"/>
<Setter Property="Margin" Value="0,2"/>
<Setter Property="CornerRadius" Value="{DynamicResource ButtonCornerRadius}"/>
<Setter Property="Transitions">
<Transitions>
<BrushTransition Property="Background" Duration="0:0:0.2"/>
<BrushTransition Property="Foreground" Duration="0:0:0.2"/>
</Transitions>
</Setter>
</Style>
<!-- 导航按钮悬停状态 -->
<Style Selector="Button.navigation-button:pointerover">
<Setter Property="Background" Value="{DynamicResource NavigationHoverBrush}"/>
<Setter Property="Foreground" Value="{DynamicResource NavigationHoverTextBrush}"/>
</Style>
<!-- 导航按钮按下状态 -->
<Style Selector="Button.navigation-button:pressed">
<Setter Property="Background" Value="{DynamicResource PressedBrush}"/>
<Setter Property="Foreground" Value="{DynamicResource PrimaryTextBrush}"/>
</Style>
<!-- 导航按钮选中状态 -->
<Style Selector="Button.navigation-button.selected">
<Setter Property="Background" Value="{DynamicResource NavigationSelectedBrush}"/>
<Setter Property="Foreground" Value="{DynamicResource PrimaryTextBrush}"/>
</Style>
<!-- 导航按钮选中状态悬停 -->
<Style Selector="Button.navigation-button.selected:pointerover">
<Setter Property="Background" Value="{DynamicResource NavigationSelectedHoverBrush}"/>
<Setter Property="Foreground" Value="{DynamicResource PrimaryTextBrush}"/>
</Style>
<!-- 主要按钮样式 -->
<Style Selector="Button.primary">
<Setter Property="Background" Value="{DynamicResource PrimaryBrush}"/>
<Setter Property="Foreground" Value="{DynamicResource PrimaryTextBrush}"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Padding" Value="{DynamicResource ButtonPadding}"/>
<Setter Property="CornerRadius" Value="{DynamicResource ButtonCornerRadius}"/>
<Setter Property="FontSize" Value="{DynamicResource BodyFontSize}"/>
<Setter Property="Transitions">
<Transitions>
<BrushTransition Property="Background" Duration="0:0:0.2"/>
</Transitions>
</Setter>
</Style>
<Style Selector="Button.primary:pointerover">
<Setter Property="Background" Value="{DynamicResource PrimaryHoverBrush}"/>
</Style>
<!-- 成功按钮样式 -->
<Style Selector="Button.success">
<Setter Property="Background" Value="{DynamicResource SuccessBrush}"/>
<Setter Property="Foreground" Value="{DynamicResource PrimaryTextBrush}"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Padding" Value="{DynamicResource ButtonPadding}"/>
<Setter Property="CornerRadius" Value="{DynamicResource ButtonCornerRadius}"/>
<Setter Property="FontSize" Value="{DynamicResource BodyFontSize}"/>
</Style>
<!-- 危险按钮样式 -->
<Style Selector="Button.danger">
<Setter Property="Background" Value="{DynamicResource ErrorBrush}"/>
<Setter Property="Foreground" Value="{DynamicResource PrimaryTextBrush}"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Padding" Value="{DynamicResource ButtonPadding}"/>
<Setter Property="CornerRadius" Value="{DynamicResource ButtonCornerRadius}"/>
<Setter Property="FontSize" Value="{DynamicResource BodyFontSize}"/>
</Style>
<!-- 文本框样式 -->
<Style Selector="TextBox">
<Setter Property="Background" Value="{DynamicResource InputBackgroundBrush}"/>
<Setter Property="Foreground" Value="{DynamicResource PrimaryTextBrush}"/>
<Setter Property="BorderBrush" Value="{DynamicResource BorderBrush}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="CornerRadius" Value="{DynamicResource InputCornerRadius}"/>
<Setter Property="Padding" Value="{DynamicResource InputPadding}"/>
<Setter Property="FontSize" Value="{DynamicResource BodyFontSize}"/>
<Setter Property="Transitions">
<Transitions>
<BrushTransition Property="BorderBrush" Duration="0:0:0.1"/>
</Transitions>
</Setter>
</Style>
<Style Selector="TextBox:focus">
<Setter Property="BorderBrush" Value="{DynamicResource PrimaryBrush}"/>
</Style>
<Style Selector="TextBox:pointerover">
<Setter Property="BorderBrush" Value="{DynamicResource DividerBrush}"/>
</Style>
<!-- 下拉框样式 -->
<Style Selector="ComboBox">
<Setter Property="Background" Value="{DynamicResource InputBackgroundBrush}"/>
<Setter Property="Foreground" Value="{DynamicResource PrimaryTextBrush}"/>
<Setter Property="BorderBrush" Value="{DynamicResource BorderBrush}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="CornerRadius" Value="{DynamicResource InputCornerRadius}"/>
<Setter Property="Padding" Value="{DynamicResource InputPadding}"/>
<Setter Property="FontSize" Value="{DynamicResource BodyFontSize}"/>
</Style>
<Style Selector="ComboBox:focus">
<Setter Property="BorderBrush" Value="{DynamicResource PrimaryBrush}"/>
</Style>
<Style Selector="ComboBox:pointerover">
<Setter Property="BorderBrush" Value="{DynamicResource DividerBrush}"/>
</Style>
<!-- 下拉框项目样式 -->
<Style Selector="ComboBoxItem">
<Setter Property="Background" Value="{DynamicResource InputBackgroundBrush}"/>
<Setter Property="Foreground" Value="{DynamicResource PrimaryTextBrush}"/>
<Setter Property="Padding" Value="{DynamicResource InputPadding}"/>
</Style>
<Style Selector="ComboBoxItem:pointerover">
<Setter Property="Background" Value="{DynamicResource HoverBrush}"/>
</Style>
<Style Selector="ComboBoxItem:selected">
<Setter Property="Background" Value="{DynamicResource PrimaryBrush}"/>
</Style>
<!-- 列表框样式 -->
<Style Selector="ListBox">
<Setter Property="Background" Value="{DynamicResource PanelBackgroundBrush}"/>
<Setter Property="BorderBrush" Value="{DynamicResource BorderBrush}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="CornerRadius" Value="{DynamicResource CardCornerRadius}"/>
<Setter Property="Padding" Value="0"/>
</Style>
<Style Selector="ListBoxItem">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Foreground" Value="{DynamicResource PrimaryTextBrush}"/>
<Setter Property="Padding" Value="{DynamicResource ListItemPadding}"/>
<Setter Property="Margin" Value="2"/>
<Setter Property="CornerRadius" Value="{DynamicResource ListItemCornerRadius}"/>
<Setter Property="Transitions">
<Transitions>
<BrushTransition Property="Background" Duration="0:0:0.1"/>
</Transitions>
</Setter>
</Style>
<Style Selector="ListBoxItem:pointerover">
<Setter Property="Background" Value="{DynamicResource ListItemHoverBrush}"/>
</Style>
<Style Selector="ListBoxItem:selected">
<Setter Property="Background" Value="{DynamicResource ListItemSelectedBrush}"/>
</Style>
<!-- 标题文字样式 -->
<Style Selector="TextBlock.header">
<Setter Property="FontSize" Value="{DynamicResource HeaderFontSize}"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Foreground" Value="{DynamicResource PrimaryTextBrush}"/>
</Style>
<Style Selector="TextBlock.subheader">
<Setter Property="FontSize" Value="{DynamicResource SubHeaderFontSize}"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Foreground" Value="{DynamicResource PrimaryTextBrush}"/>
</Style>
<Style Selector="TextBlock.title">
<Setter Property="FontSize" Value="{DynamicResource TitleFontSize}"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Foreground" Value="{DynamicResource PrimaryTextBrush}"/>
</Style>
<Style Selector="TextBlock.body">
<Setter Property="FontSize" Value="{DynamicResource BodyFontSize}"/>
<Setter Property="Foreground" Value="{DynamicResource PrimaryTextBrush}"/>
</Style>
<Style Selector="TextBlock.caption">
<Setter Property="FontSize" Value="{DynamicResource CaptionFontSize}"/>
<Setter Property="Foreground" Value="{DynamicResource SecondaryTextBrush}"/>
</Style>
<Style Selector="TextBlock.icon">
<Setter Property="FontSize" Value="{DynamicResource IconFontSize}"/>
</Style>
<!-- 卡片样式 -->
<Style Selector="Border.card">
<Setter Property="Background" Value="{DynamicResource CardBackgroundBrush}"/>
<Setter Property="BorderBrush" Value="{DynamicResource BorderBrush}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="CornerRadius" Value="{DynamicResource CardCornerRadius}"/>
<Setter Property="Padding" Value="{DynamicResource StandardMargin}"/>
</Style>
<!-- 分割线样式 -->
<Style Selector="Border.divider">
<Setter Property="Background" Value="{DynamicResource DividerBrush}"/>
<Setter Property="Height" Value="1"/>
<Setter Property="Margin" Value="{DynamicResource StandardMargin}"/>
</Style>
</Styles>