Files
AddinManager/AddInManager/Wpf/Styles/ModernStyles.xaml
2025-09-04 09:53:20 +08:00

862 lines
45 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<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>