Files
AddinManager/AddInManager/Wpf/Styles/ModernStyles.xaml

862 lines
45 KiB
Plaintext
Raw Normal View History

2025-09-04 09:53:20 +08:00
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:AddInManager.Wpf">
<!-- 颜色定义 -->
<SolidColorBrush x:Key="PrimaryBrush" Color="#0078D4" />
<SolidColorBrush x:Key="PrimaryHoverBrush" Color="#106EBE" />
<SolidColorBrush x:Key="PrimaryPressedBrush" Color="#005A9E" />
<SolidColorBrush x:Key="DangerBrush" Color="#D83B01" />
<SolidColorBrush x:Key="DangerHoverBrush" Color="#A4262C" />
<SolidColorBrush x:Key="DangerPressedBrush" Color="#8B1E25" />
<SolidColorBrush x:Key="SecondaryBrush" Color="#605E5C" />
<SolidColorBrush x:Key="SecondaryHoverBrush" Color="#484644" />
<SolidColorBrush x:Key="SecondaryPressedBrush" Color="#323130" />
<SolidColorBrush x:Key="BorderBrush" Color="#D1D1D1" />
<SolidColorBrush x:Key="LightBorderBrush" Color="#E1DFDD" />
<SolidColorBrush x:Key="BackgroundBrush" Color="#F5F5F5" />
<SolidColorBrush x:Key="LightBackgroundBrush" Color="#F8F8F8" />
<SolidColorBrush x:Key="TextBrush" Color="#323130" />
<SolidColorBrush x:Key="SecondaryTextBrush" Color="#605E5C" />
<SolidColorBrush x:Key="DisabledBrush" Color="#CCCCCC" />
<SolidColorBrush x:Key="DisabledTextBrush" Color="#888888" />
<Style TargetType="TextBlock">
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
<Style TargetType="Button">
<Setter Property="BorderThickness" Value="0" />
<Setter Property="FontSize" Value="12" />
<Setter Property="Padding" Value="12,4" />
<Setter Property="Cursor" Value="Hand" />
<Setter Property="HorizontalContentAlignment" Value="Center" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border
x:Name="border"
Padding="{TemplateBinding Padding}"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="4">
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Background" Value="{StaticResource DisabledBrush}" />
<Setter Property="Foreground" Value="{StaticResource DisabledTextBrush}" />
</Trigger>
</Style.Triggers>
</Style>
<Style
x:Key="ActionButton"
BasedOn="{StaticResource {x:Type Button}}"
TargetType="Button">
<!-- 1. 设置基础样式 (默认为次要按钮的外观) -->
<Setter Property="Background" Value="White" />
<Setter Property="Foreground" Value="{StaticResource TextBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="BorderBrush" Value="{StaticResource BorderBrush}" />
<Setter Property="Padding" Value="12,4" />
<Style.Triggers>
<!-- 2. 基础状态触发器 (默认/次要按钮) -->
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#F3F2F1" />
<Setter Property="BorderBrush" Value="{StaticResource PrimaryBrush}" />
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background" Value="#EDEBE9" />
</Trigger>
<!-- =============================================================== -->
<!-- 3. 基于 Tag 属性改变外观的核心 DataTriggers -->
<!-- =============================================================== -->
<!-- 当 Tag="Primary" 时,应用主要按钮颜色 -->
<DataTrigger Binding="{Binding Path=Tag, RelativeSource={RelativeSource Self}}" Value="Primary">
<Setter Property="Background" Value="{StaticResource PrimaryBrush}" />
<Setter Property="Foreground" Value="White" />
<Setter Property="BorderBrush" Value="{StaticResource PrimaryBrush}" />
</DataTrigger>
<!-- 当 Tag="Danger" 时,应用危险按钮颜色 -->
<DataTrigger Binding="{Binding Path=Tag, RelativeSource={RelativeSource Self}}" Value="Danger">
<Setter Property="Background" Value="{StaticResource DangerBrush}" />
<Setter Property="Foreground" Value="White" />
<Setter Property="BorderBrush" Value="{StaticResource DangerBrush}" />
</DataTrigger>
<!-- =============================================================== -->
<!-- 4. 复合触发器,处理不同 Tag 下的悬停和按下状态 -->
<!-- =============================================================== -->
<!-- 当 Tag="Primary" 并且 IsMouseOver="True" -->
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=Tag, RelativeSource={RelativeSource Self}}" Value="Primary" />
<Condition Binding="{Binding Path=IsMouseOver, RelativeSource={RelativeSource Self}}" Value="True" />
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="{StaticResource PrimaryHoverBrush}" />
</MultiDataTrigger>
<!-- 当 Tag="Primary" 并且 IsPressed="True" -->
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=Tag, RelativeSource={RelativeSource Self}}" Value="Primary" />
<Condition Binding="{Binding Path=IsPressed, RelativeSource={RelativeSource Self}}" Value="True" />
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="{StaticResource PrimaryPressedBrush}" />
</MultiDataTrigger>
<!-- 当 Tag="Danger" 并且 IsMouseOver="True" -->
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=Tag, RelativeSource={RelativeSource Self}}" Value="Danger" />
<Condition Binding="{Binding Path=IsMouseOver, RelativeSource={RelativeSource Self}}" Value="True" />
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="{StaticResource DangerHoverBrush}" />
</MultiDataTrigger>
<!-- 当 Tag="Danger" 并且 IsPressed="True" -->
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=Tag, RelativeSource={RelativeSource Self}}" Value="Danger" />
<Condition Binding="{Binding Path=IsPressed, RelativeSource={RelativeSource Self}}" Value="True" />
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="{StaticResource DangerPressedBrush}" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
<!-- 浏览按钮样式 -->
<Style
x:Key="BrowseButton"
BasedOn="{StaticResource {x:Type Button}}"
TargetType="Button">
<Setter Property="Background" Value="{StaticResource SecondaryBrush}" />
<Setter Property="Foreground" Value="White" />
<!--<Setter Property="Padding" Value="12,6" />-->
<Setter Property="FontSize" Value="11" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border
Padding="{TemplateBinding Padding}"
Background="{TemplateBinding Background}"
CornerRadius="0,4,4,0">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{StaticResource SecondaryHoverBrush}" />
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background" Value="{StaticResource SecondaryPressedBrush}" />
</Trigger>
</Style.Triggers>
</Style>
<!-- 工具栏按钮样式 -->
<Style
x:Key="ToolbarButton"
BasedOn="{StaticResource {x:Type Button}}"
TargetType="Button">
<Setter Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="{StaticResource SecondaryTextBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="BorderBrush" Value="{StaticResource BorderBrush}" />
<Setter Property="FontSize" Value="10" />
<Setter Property="Width" Value="20" />
<Setter Property="Height" Value="20" />
<Setter Property="Padding" Value="0" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border
Padding="{TemplateBinding Padding}"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="3">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{StaticResource LightBackgroundBrush}" />
<Setter Property="BorderBrush" Value="{StaticResource PrimaryBrush}" />
<Setter Property="Foreground" Value="{StaticResource PrimaryBrush}" />
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background" Value="{StaticResource PrimaryBrush}" />
<Setter Property="Foreground" Value="White" />
</Trigger>
</Style.Triggers>
</Style>
<Style TargetType="TextBox">
<Setter Property="Padding" Value="4" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="BorderBrush" Value="{StaticResource BorderBrush}" />
<Setter Property="Background" Value="White" />
<Setter Property="FontSize" Value="12" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TextBox">
<Border
x:Name="border"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="4">
<ScrollViewer x:Name="PART_ContentHost" Margin="{TemplateBinding Padding}" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsFocused" Value="True">
<Setter Property="BorderBrush" Value="{StaticResource PrimaryBrush}" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="BorderBrush" Value="{StaticResource PrimaryHoverBrush}" />
</Trigger>
<!-- 这就是替代 ReadOnlyTextBox 的触发器 -->
<Trigger Property="IsReadOnly" Value="True">
<Setter Property="Background" Value="{StaticResource LightBackgroundBrush}" />
<Setter Property="BorderBrush" Value="{StaticResource LightBorderBrush}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- 2. 搜索文本框样式 (内置图标、水印和清除按钮) -->
<Style
x:Key="SearchTextBox"
BasedOn="{StaticResource {x:Type TextBox}}"
TargetType="TextBox">
<Setter Property="Tag" Value="搜索命令..." />
<!-- 用于水印的默认文本 -->
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TextBox">
<Border
x:Name="border"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="4"
SnapsToDevicePixels="True">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<!-- 搜索图标 -->
<TextBlock
Margin="8,0,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
FontFamily="Segoe MDL2 Assets"
FontSize="12"
Foreground="{StaticResource SecondaryTextBrush}"
IsHitTestVisible="False"
Text="&#xE721;" />
<!-- 这是TextBox实际输入内容的地方 -->
<ScrollViewer
x:Name="PART_ContentHost"
Grid.Column="1"
Focusable="false"
HorizontalScrollBarVisibility="Hidden"
VerticalScrollBarVisibility="Hidden" />
<!-- 水印文本 -->
<TextBlock
x:Name="Watermark"
Grid.Column="1"
Margin="{TemplateBinding Padding}"
VerticalAlignment="Center"
Foreground="{StaticResource SecondaryTextBrush}"
IsHitTestVisible="False"
Text="{TemplateBinding Tag}">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Visibility" Value="Collapsed" />
<Style.Triggers>
<DataTrigger Binding="{Binding Text, RelativeSource={RelativeSource TemplatedParent}}" Value="">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
<!-- 清除按钮 -->
<Button
x:Name="PART_ClearButton"
Grid.Column="2"
Width="16"
Height="16"
Margin="0,0,6,0"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Content="✕"
Cursor="Hand"
FontSize="10">
<Button.Style>
<Style TargetType="Button">
<Setter Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="{StaticResource SecondaryTextBrush}" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="Visibility" Value="Collapsed" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border
Padding="2"
Background="{TemplateBinding Background}"
CornerRadius="8">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding Text, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=TextBox}}" Value="">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{StaticResource LightBackgroundBrush}" />
<Setter Property="Foreground" Value="{StaticResource TextBrush}" />
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="border" Property="BorderBrush" Value="{StaticResource PrimaryHoverBrush}" />
</Trigger>
<Trigger Property="IsFocused" Value="True">
<Setter TargetName="border" Property="BorderBrush" Value="{StaticResource PrimaryBrush}" />
<Setter TargetName="border" Property="BorderThickness" Value="1" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- 文件路径文本框样式 -->
<Style
x:Key="FilePathTextBox"
BasedOn="{StaticResource {x:Type TextBox}}"
TargetType="TextBox">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TextBox">
<Border
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="4,0,0,4">
<ScrollViewer x:Name="PART_ContentHost" Margin="{TemplateBinding Padding}" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsFocused" Value="True">
<Setter Property="BorderBrush" Value="{StaticResource PrimaryBrush}" />
<Setter Property="BorderThickness" Value="2" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="BorderBrush" Value="{StaticResource PrimaryHoverBrush}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- ================================================================== -->
<!-- 扁平化 TabControl 样式 (替换旧样式) -->
<!-- ================================================================== -->
<!-- TabControl 样式 -->
<!-- 这个模板创建了一个清晰的结构:顶部是标签头,下面是带上边框的内容区域 -->
<Style TargetType="TabControl">
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="Padding" Value="0" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TabControl">
<Grid KeyboardNavigation.TabNavigation="Local">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<!-- 1. 顶部的标签头区域 -->
<TabPanel
Grid.Row="0"
Margin="0,0,0,-1"
Background="Transparent"
IsItemsHost="true"
KeyboardNavigation.TabIndex="1"
ZIndex="1" />
<!-- 2. 下方的内容区域,顶部有一条分割线 -->
<Border
Grid.Row="1"
Background="White"
BorderBrush="{StaticResource BorderBrush}"
BorderThickness="0,1,0,0"
KeyboardNavigation.DirectionalNavigation="Contained"
KeyboardNavigation.TabIndex="2"
KeyboardNavigation.TabNavigation="Local">
<ContentPresenter
x:Name="PART_SelectedContentHost"
Margin="{TemplateBinding Padding}"
ContentSource="SelectedContent"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- TabItem 样式 -->
<!-- 这是实现扁平化风格的核心。它使用 BorderThickness 来创建下划线效果 -->
<Style TargetType="TabItem">
<Setter Property="Padding" Value="12,8" />
<Setter Property="Margin" Value="0,0,5,0" />
<Setter Property="Foreground" Value="{StaticResource SecondaryTextBrush}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TabItem">
<!-- 我们使用一个Border作为标签的基础它的下边框将作为指示器 -->
<Border
x:Name="Border"
Margin="{TemplateBinding Margin}"
Padding="{TemplateBinding Padding}"
Background="Transparent"
BorderBrush="Transparent"
BorderThickness="0,0,0,2">
<ContentPresenter
x:Name="ContentSite"
HorizontalAlignment="Center"
VerticalAlignment="Center"
ContentSource="Header" />
</Border>
<ControlTemplate.Triggers>
<!-- 当标签被选中时 -->
<Trigger Property="IsSelected" Value="True">
<Setter Property="Foreground" Value="{StaticResource PrimaryBrush}" />
<!--<Setter Property="FontWeight" Value="SemiBold" />-->
<!-- 显示彩色的下划线 -->
<Setter TargetName="Border" Property="BorderBrush" Value="{StaticResource PrimaryBrush}" />
</Trigger>
<!-- 当鼠标悬停在一个未选中的标签上时 -->
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="False" />
<Condition Property="IsMouseOver" Value="True" />
</MultiTrigger.Conditions>
<Setter Property="Foreground" Value="{StaticResource TextBrush}" />
<!-- 显示一条灰色的下划线作为悬停反馈 -->
<Setter TargetName="Border" Property="BorderBrush" Value="{StaticResource BorderBrush}" />
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- TreeView 样式 -->
<Style TargetType="TreeView">
<Setter Property="Background" Value="White" />
<Setter Property="BorderBrush" Value="{StaticResource BorderBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Padding" Value="4" />
</Style>
<!-- TreeViewItem 的展开/折叠按钮 (ToggleButton) 样式 -->
<Style x:Key="ExpandCollapseToggleStyle" TargetType="ToggleButton">
<Setter Property="Focusable" Value="False" />
<Setter Property="HorizontalContentAlignment" Value="Center" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="Width" Value="16" />
<Setter Property="Height" Value="16" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToggleButton">
<Grid
x:Name="container"
Width="{TemplateBinding Width}"
Height="{TemplateBinding Height}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
Background="Transparent"
RenderTransformOrigin="0.5,0.5">
<Grid.RenderTransform>
<RotateTransform Angle="0" />
</Grid.RenderTransform>
<!-- 将 Path 包装在 Viewbox 中以实现居中和缩放 -->
<Viewbox Width="8" Height="8">
<Path
x:Name="arrow"
Data="M 0,0 L 4,4 L 0,8"
Fill="Transparent"
Stroke="{Binding Path=Foreground, RelativeSource={RelativeSource AncestorType=ToggleButton}}"
StrokeThickness="1.5" />
</Viewbox>
</Grid>
<ControlTemplate.Triggers>
<!-- 展开时旋转箭头 -->
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="container" Property="RenderTransform">
<Setter.Value>
<RotateTransform Angle="90" />
</Setter.Value>
</Setter>
<Setter TargetName="arrow" Property="Stroke" Value="{StaticResource SecondaryTextBrush}" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="arrow" Property="Stroke" Value="{StaticResource TextBrush}" />
</Trigger>
<!-- 禁用时的样式 -->
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="arrow" Property="Stroke" Value="{StaticResource DisabledTextBrush}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- 用于计算子项缩进的辅助转换器 -->
<local:LeftMarginMultiplier x:Key="LeftMarginMultiplier" />
<!-- TreeViewItem 的主样式 -->
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="Background" Value="Transparent" />
<Setter Property="Padding" Value="2,3" />
<Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" />
<Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TreeViewItem}">
<StackPanel>
<Border
x:Name="Bd"
Padding="{TemplateBinding Padding}"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="4">
<Grid Margin="{Binding Converter={StaticResource LeftMarginMultiplier}, ConverterParameter=19, RelativeSource={RelativeSource TemplatedParent}}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<!-- 展开/折叠按钮 -->
<ToggleButton
x:Name="Expander"
ClickMode="Press"
IsChecked="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}"
Style="{StaticResource ExpandCollapseToggleStyle}" />
<!-- 内容 (Header) -->
<ContentPresenter
x:Name="PART_Header"
Grid.Column="1"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
ContentSource="Header"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
</Grid>
</Border>
<!-- 子项容器 -->
<ItemsPresenter x:Name="ItemsHost" Visibility="Collapsed" />
</StackPanel>
<ControlTemplate.Triggers>
<!-- 当有子项时才显示展开按钮 -->
<Trigger Property="HasItems" Value="false">
<Setter TargetName="Expander" Property="Visibility" Value="Hidden" />
</Trigger>
<!-- 当被展开时,显示子项 -->
<Trigger Property="IsExpanded" Value="true">
<Setter TargetName="ItemsHost" Property="Visibility" Value="Visible" />
</Trigger>
<!-- 选中时的背景高亮 -->
<Trigger Property="IsSelected" Value="true">
<Setter TargetName="Bd" Property="Background" Value="{StaticResource LightBackgroundBrush}" />
</Trigger>
<!-- 多选高亮 (用于按下Ctrl键时) -->
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true" />
<Condition Property="IsSelectionActive" Value="false" />
</MultiTrigger.Conditions>
<Setter TargetName="Bd" Property="Background" Value="{StaticResource BorderBrush}" />
</MultiTrigger>
<!-- 禁用时的样式 -->
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="{StaticResource DisabledTextBrush}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- 窗口容器样式 -->
<Style x:Key="WindowContainer" TargetType="Border">
<Setter Property="Background" Value="White" />
<Setter Property="CornerRadius" Value="8" />
<Setter Property="Effect">
<Setter.Value>
<DropShadowEffect
BlurRadius="8"
Opacity="0.1"
ShadowDepth="2"
Color="Black" />
</Setter.Value>
</Setter>
</Style>
<!-- 主内容区域样式 -->
<Style x:Key="ContentContainer" TargetType="Border">
<Setter Property="Background" Value="White" />
<Setter Property="BorderBrush" Value="{StaticResource BorderBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="CornerRadius" Value="6" />
</Style>
<!-- CheckBox 样式 -->
<Style TargetType="CheckBox">
<Setter Property="Foreground" Value="{StaticResource TextBrush}" />
<Setter Property="FontSize" Value="12" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="HorizontalContentAlignment" Value="Left" />
<Setter Property="IsThreeState" Value="False" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="CheckBox">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Border
x:Name="Border"
Grid.Column="0"
Width="18"
Height="18"
Margin="0,0,8,0"
Background="White"
BorderBrush="{StaticResource BorderBrush}"
BorderThickness="1"
CornerRadius="3">
<Grid>
<!-- 选中状态的勾选标记 -->
<Path
x:Name="CheckMark"
Data="M 3,9 L 7,13 L 15,5"
Fill="Transparent"
Stroke="White"
StrokeLineJoin="Round"
StrokeThickness="2"
Visibility="Collapsed" />
<!-- 不确定状态的标记 -->
<Rectangle
x:Name="IndeterminateMark"
Width="8"
Height="2"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Fill="White"
Visibility="Collapsed" />
</Grid>
</Border>
<ContentPresenter
Grid.Column="1"
HorizontalAlignment="Left"
VerticalAlignment="Center"
ContentSource="Content" />
</Grid>
<ControlTemplate.Triggers>
<!-- 选中状态 -->
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="CheckMark" Property="Visibility" Value="Visible" />
<Setter TargetName="Border" Property="Background" Value="{StaticResource PrimaryBrush}" />
<Setter TargetName="Border" Property="BorderBrush" Value="{StaticResource PrimaryBrush}" />
</Trigger>
<!-- 不确定状态 -->
<Trigger Property="IsChecked" Value="{x:Null}">
<Setter TargetName="IndeterminateMark" Property="Visibility" Value="Visible" />
<Setter TargetName="Border" Property="Background" Value="{StaticResource PrimaryBrush}" />
<Setter TargetName="Border" Property="BorderBrush" Value="{StaticResource PrimaryBrush}" />
</Trigger>
<!-- 禁用状态 -->
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="Border" Property="Background" Value="{StaticResource DisabledBrush}" />
<Setter TargetName="Border" Property="BorderBrush" Value="{StaticResource DisabledBrush}" />
<Setter TargetName="CheckMark" Property="Stroke" Value="{StaticResource DisabledTextBrush}" />
<Setter TargetName="IndeterminateMark" Property="Fill" Value="{StaticResource DisabledTextBrush}" />
</Trigger>
<!-- 鼠标悬停状态 -->
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Border" Property="BorderBrush" Value="{StaticResource PrimaryHoverBrush}" />
</Trigger>
<!-- 鼠标悬停且选中状态 -->
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True" />
<Condition Property="IsChecked" Value="True" />
</MultiTrigger.Conditions>
<Setter TargetName="Border" Property="Background" Value="{StaticResource PrimaryHoverBrush}" />
<Setter TargetName="Border" Property="BorderBrush" Value="{StaticResource PrimaryHoverBrush}" />
</MultiTrigger>
<!-- 鼠标悬停且不确定状态 -->
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True" />
<Condition Property="IsChecked" Value="{x:Null}" />
</MultiTrigger.Conditions>
<Setter TargetName="Border" Property="Background" Value="{StaticResource PrimaryHoverBrush}" />
<Setter TargetName="Border" Property="BorderBrush" Value="{StaticResource PrimaryHoverBrush}" />
</MultiTrigger>
<!-- 按下状态 -->
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="Border" Property="Background" Value="{StaticResource PrimaryPressedBrush}" />
<Setter TargetName="Border" Property="BorderBrush" Value="{StaticResource PrimaryPressedBrush}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- ================================================================== -->
<!-- ContextMenu, MenuItem, and Separator Styles -->
<!-- ================================================================== -->
<!-- 右键菜单中的分隔符样式 -->
<Style x:Key="ModernContextMenuSeparator" TargetType="Separator">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Separator">
<Rectangle
Height="1"
Margin="30,4,4,4"
Fill="{StaticResource BorderBrush}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- 右键菜单 (ContextMenu) 的整体样式 -->
<Style TargetType="{x:Type ContextMenu}">
<Setter Property="Background" Value="White" />
<Setter Property="BorderBrush" Value="{StaticResource BorderBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Padding" Value="2" />
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ContextMenu}">
<Border
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="4">
<Border.Effect>
<DropShadowEffect
BlurRadius="4"
Opacity="0.5"
ShadowDepth="1"
Color="#CCCCCC" />
</Border.Effect>
<StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Cycle" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- 菜单项 (MenuItem) 的样式 -->
<Style TargetType="{x:Type MenuItem}">
<Setter Property="Height" Value="32" />
<Setter Property="Padding" Value="8,0" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type MenuItem}">
<Border
x:Name="Border"
Margin="3"
Padding="0"
CornerRadius="3">
<Grid>
<Grid.ColumnDefinitions>
<!-- 定义图标列宽度固定为30 -->
<ColumnDefinition Width="30" SharedSizeGroup="Icon" />
<!-- 定义标题列,自动填充剩余空间 -->
<ColumnDefinition Width="*" />
<!-- 定义快捷键列,宽度自动 -->
<ColumnDefinition Width="Auto" SharedSizeGroup="Shortcut" />
</Grid.ColumnDefinitions>
<!-- 图标内容呈现器 -->
<ContentPresenter
x:Name="Icon"
Margin="6,0"
VerticalAlignment="Center"
ContentSource="Icon" />
<!-- 标题文本内容呈现器 -->
<ContentPresenter
x:Name="HeaderHost"
Grid.Column="1"
VerticalAlignment="Center"
ContentSource="Header" />
</Grid>
</Border>
<ControlTemplate.Triggers>
<!-- 鼠标悬停时的高亮效果 -->
<Trigger Property="IsHighlighted" Value="True">
<Setter TargetName="Border" Property="Background" Value="{StaticResource LightBackgroundBrush}" />
</Trigger>
<!-- 禁用时的样式 -->
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="{StaticResource DisabledTextBrush}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<!-- 将 ModernContextMenuSeparator 样式应用到 MenuItem 内部的 Separator -->
<Style.Resources>
<Style BasedOn="{StaticResource ModernContextMenuSeparator}" TargetType="Separator" />
</Style.Resources>
</Style>
</ResourceDictionary>