Files
ShrlAlgoToolkit/Melskin/Controls/DataGrid.xaml
2026-02-12 21:29:00 +08:00

711 lines
43 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:assists="clr-namespace:Melskin.Assists"
xmlns:controls="clr-namespace:Melskin.Controls"
xmlns:converters="clr-namespace:Melskin.Converters"
xmlns:decorations="clr-namespace:Melskin.Controls.Decorations"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- 将 DataGrid 自己通过 DataContext 传给代理 -->
<!--<assists:BindingProxy x:Key="DataGridProxy" Data="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}" />-->
<!-- 勾选框样式 -->
<Style TargetType="{x:Type CheckBox}" x:Key="DataGridCheckBoxStyle">
<Setter Property="FocusVisualStyle" Value="{DynamicResource FocusVisual}" />
<Setter Property="Background" Value="{DynamicResource ControlBackgroundNormalBrush}" />
<Setter Property="BorderBrush" Value="{DynamicResource BorderNormalBrush}" />
<Setter Property="Foreground" Value="{DynamicResource TextPrimaryBrush}" />
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="FontSize" Value="14" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type CheckBox}">
<Border
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="4"
Height="18"
HorizontalAlignment="Center"
Margin="4,2"
RenderTransformOrigin="0.5,0.5"
VerticalAlignment="Center"
Width="18"
x:Name="checkBoxBorder">
<Grid Margin="-1">
<controls:IconElement
Foreground="{TemplateBinding Foreground}"
Margin="3"
Symbol="Check"
Visibility="Hidden"
x:Name="checkMark" />
<Rectangle
Fill="{TemplateBinding Foreground}"
Margin="3"
RadiusX="3"
RadiusY="3"
Visibility="Hidden"
x:Name="indeterminateMark" />
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="HasContent" Value="True" />
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="BorderBrush" TargetName="checkBoxBorder" Value="{DynamicResource PrimaryFocusedBrush}" />
<Setter Property="Fill" TargetName="indeterminateMark" Value="{DynamicResource PrimaryFocusedBrush}" />
<Setter Property="Foreground" TargetName="checkMark" Value="{DynamicResource PrimaryFocusedBrush}" />
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="BorderBrush" TargetName="checkBoxBorder" Value="{DynamicResource TextDisabledBrush}" />
<Setter Property="Background" TargetName="checkBoxBorder" Value="{DynamicResource ControlBackgroundDisabledBrush}" />
<Setter Property="Fill" TargetName="indeterminateMark" Value="{DynamicResource TextDisabledBrush}" />
<Setter Property="Foreground" TargetName="checkMark" Value="{DynamicResource TextDisabledBrush}" />
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="RenderTransform" TargetName="checkBoxBorder">
<Setter.Value>
<ScaleTransform ScaleX="0.9" ScaleY="0.9" />
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Visibility" TargetName="checkMark" Value="Visible" />
</Trigger>
<Trigger Property="IsChecked" Value="{x:Null}">
<Setter Property="Visibility" TargetName="indeterminateMark" Value="Visible" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- 格子内容 -->
<Style TargetType="{x:Type DataGridCell}" x:Key="DefaultDataGridCellStyle">
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderBrush" Value="Transparent" />
<!--<Setter Property="Padding" Value="8,4"/>-->
<Setter Property="VerticalContentAlignment" Value="Stretch" />
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Border
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Padding="{TemplateBinding Padding}"
SnapsToDevicePixels="True">
<ContentPresenter
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
x:Name="content" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<!-- 某行被选中的效果由Row控制 -->
<Trigger Property="IsSelected" Value="True">
<Setter Property="Foreground" Value="{DynamicResource TextPrimaryBrush}" />
</Trigger>
<!-- 某一格被选中的效果 -->
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter Property="Background" Value="{DynamicResource ControlBackgroundSelectedBrush}" />
</Trigger>
<!-- 选中但窗口没激活由Row控制 -->
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="True" />
<Condition Property="Selector.IsSelectionActive" Value="False" />
</MultiTrigger.Conditions>
<Setter Property="Foreground" Value="{DynamicResource TextPrimaryBrush}" />
</MultiTrigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="{DynamicResource TextDisabledBrush}" />
</Trigger>
</Style.Triggers>
</Style>
<!-- 表头分割区域 -->
<Style TargetType="{x:Type Thumb}" x:Key="DefaultColumnHeaderGripperStyle">
<Setter Property="Width" Value="8" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="Cursor" Value="SizeWE" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Thumb}">
<Border Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- 表头样式 -->
<Style TargetType="{x:Type DataGridColumnHeader}" x:Key="DefaultDataGridColumnHeaderStyle">
<Setter Property="Padding" Value="8,4" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="SeparatorVisibility" Value="Visible" />
<Setter Property="SeparatorBrush" Value="{DynamicResource BorderNormalBrush}" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
<Grid>
<!-- TODO: IsClickable="{TemplateBinding CanUserSort}" -->
<Border
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Padding="{TemplateBinding Padding}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="auto" />
</Grid.ColumnDefinitions>
<ContentPresenter
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
RecognizesAccessKey="True"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
<Path
Grid.Column="1"
HorizontalAlignment="Center"
Margin="4,0,0,0"
SnapsToDevicePixels="False"
Stroke="{DynamicResource TextSecondaryBrush}"
StrokeThickness="2"
VerticalAlignment="Center"
x:Name="sortMark" />
</Grid>
</Border>
<Border
Background="{TemplateBinding SeparatorBrush}"
HorizontalAlignment="Right"
Visibility="{TemplateBinding SeparatorVisibility}"
Width="1"
x:Name="separatorV" />
<Border
Background="{TemplateBinding SeparatorBrush}"
Height="1"
VerticalAlignment="Bottom"
Visibility="{TemplateBinding SeparatorVisibility}"
x:Name="separatorH" />
<Thumb
HorizontalAlignment="Left"
Style="{StaticResource DefaultColumnHeaderGripperStyle}"
x:Name="PART_LeftHeaderGripper" />
<Thumb
HorizontalAlignment="Right"
Style="{StaticResource DefaultColumnHeaderGripperStyle}"
x:Name="PART_RightHeaderGripper" />
</Grid>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsPressed" Value="False" />
<Condition Property="IsMouseOver" Value="True" />
</MultiTrigger.Conditions>
<Setter Property="Background" Value="{DynamicResource ControlBackgroundSelectedBrush}" />
</MultiTrigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Visibility" TargetName="separatorV" Value="Hidden" />
<Setter Property="Visibility" TargetName="separatorH" Value="Hidden" />
<Setter Property="Background" Value="{DynamicResource ControlBackgroundPressedBrush}" />
</Trigger>
<!-- 排序方式 -->
<DataTrigger Binding="{Binding SortDirection, RelativeSource={RelativeSource Mode=Self}}" Value="Ascending">
<Setter Property="Data" TargetName="sortMark" Value="M 1,4.5 L 4.5,1 L 8,4.5" />
</DataTrigger>
<DataTrigger Binding="{Binding SortDirection, RelativeSource={RelativeSource Mode=Self}}" Value="Descending">
<Setter Property="Data" TargetName="sortMark" Value="M 1,1.5 L 4.5,5 L 8,1.5" />
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- 目标位置预览 -->
<Style x:Key="DefaultDataGridDropLocationIndicatorStyle">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Border
Background="{DynamicResource PrimaryNormalBrush}"
Margin="-1,0,0,0"
Width="4" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- 行开头分割区域 -->
<Style TargetType="{x:Type Thumb}" x:Key="DefaultRowHeaderGripperStyle">
<Setter Property="Height" Value="8" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="Cursor" Value="SizeNS" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Thumb}">
<Border Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- 行开头样式 -->
<Style TargetType="{x:Type DataGridRowHeader}" x:Key="DefaultDataGridRowHeaderStyle">
<Setter Property="MinWidth" Value="16" />
<Setter Property="Padding" Value="4,0" />
<Setter Property="SeparatorVisibility" Value="Visible" />
<Setter Property="SeparatorBrush" Value="{DynamicResource BorderNormalBrush}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridRowHeader}">
<Grid>
<Border
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Padding="{TemplateBinding Padding}">
<StackPanel Orientation="Horizontal">
<ContentPresenter
RecognizesAccessKey="True"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
VerticalAlignment="Center" />
<Control
SnapsToDevicePixels="False"
Template="{Binding ValidationErrorTemplate, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}"
Visibility="{Binding (Validation.HasError), Converter={x:Static converters:BooleanToVisibilityConverter.CollapsedInstance}, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}" />
</StackPanel>
</Border>
<Border
Background="{TemplateBinding SeparatorBrush}"
Height="1"
VerticalAlignment="Bottom"
Visibility="{TemplateBinding SeparatorVisibility}"
x:Name="separatorBorder" />
<Border
Background="{TemplateBinding SeparatorBrush}"
HorizontalAlignment="Right"
Visibility="{TemplateBinding SeparatorVisibility}"
Width="1"
x:Name="separatorVertical" />
<Thumb
Style="{StaticResource DefaultRowHeaderGripperStyle}"
VerticalAlignment="Top"
x:Name="PART_TopHeaderGripper" />
<Thumb
Style="{StaticResource DefaultRowHeaderGripperStyle}"
VerticalAlignment="Bottom"
x:Name="PART_BottomHeaderGripper" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- 整行样式 -->
<Style TargetType="{x:Type DataGridRow}" x:Key="DefaultDataGridRowStyle">
<Setter Property="Background" Value="{DynamicResource ControlBackgroundNormalBrush}" />
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="Validation.ErrorTemplate" Value="{x:Null}" />
<Setter Property="ValidationErrorTemplate">
<Setter.Value>
<ControlTemplate>
<TextBlock
FontSize="14"
FontWeight="Bold"
Foreground="{DynamicResource ErrorBrush}"
Margin="2,0,0,0"
Text="!"
VerticalAlignment="Center" />
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridRow}">
<Border
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
SnapsToDevicePixels="True"
x:Name="DGR_Border">
<SelectiveScrollingGrid>
<SelectiveScrollingGrid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</SelectiveScrollingGrid.ColumnDefinitions>
<SelectiveScrollingGrid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</SelectiveScrollingGrid.RowDefinitions>
<DataGridCellsPresenter
Grid.Column="1"
ItemsPanel="{TemplateBinding ItemsPanel}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
<!-- 绑定失败 -->
<DataGridDetailsPresenter
Grid.Column="1"
Grid.Row="1"
SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding AreRowDetailsFrozen, ConverterParameter={x:Static SelectiveScrollingOrientation.Vertical}, Converter={x:Static DataGrid.RowDetailsScrollingConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, FallbackValue=None}"
Visibility="{TemplateBinding DetailsVisibility}" />
<!-- 绑定失败 -->
<DataGridRowHeader
Grid.Column="0"
Grid.Row="0"
Grid.RowSpan="2"
SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical"
Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Row}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, FallbackValue=Visible}" />
</SelectiveScrollingGrid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="{DynamicResource PrimaryFocusedBrush}" />
</Trigger>
<!-- 选中但窗口没激活 -->
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="True" />
<Condition Property="Selector.IsSelectionActive" Value="False" />
</MultiTrigger.Conditions>
<Setter Property="Background" Value="{DynamicResource ControlBackgroundSelectedBrush}" />
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<!-- 绑定失败 -->
<Style.Triggers>
<Trigger Property="IsNewItem" Value="True">
<Setter Property="Margin" Value="{Binding NewItemMargin, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, FallbackValue=0}" />
</Trigger>
</Style.Triggers>
</Style>
<!-- 网格全选按钮 -->
<Style TargetType="{x:Type Button}" x:Key="{ComponentResourceKey ResourceId=DataGridSelectAllButtonStyle, TypeInTargetAssembly={x:Type DataGrid}}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Grid>
<Rectangle
Fill="Transparent"
SnapsToDevicePixels="True"
x:Name="Border" />
<Border
Background="{DynamicResource BorderNormalBrush}"
HorizontalAlignment="Right"
Width="1" />
<Border
Background="{DynamicResource BorderNormalBrush}"
Height="1"
VerticalAlignment="Bottom" />
<Polygon
Fill="{DynamicResource ControlBackgroundSelectedBrush}"
HorizontalAlignment="Right"
Margin="8,8,3,3"
Opacity="0.15"
Points="0,10 10,10 10,0"
Stretch="Uniform"
VerticalAlignment="Bottom"
x:Name="Arrow" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Fill" TargetName="Border" Value="{DynamicResource ControlBackgroundHoverBrush}" />
<Setter Property="Fill" TargetName="Arrow" Value="{DynamicResource ControlBackgroundHoverBrush}" />
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Fill" TargetName="Border" Value="{DynamicResource BackgroundFloatingBrush}" />
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Visibility" TargetName="Arrow" Value="Collapsed" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="{x:Type DataGrid}" x:Key="DefaultDataGridStyle">
<Setter Property="RowStyle" Value="{DynamicResource DefaultDataGridRowStyle}" />
<Setter Property="CellStyle" Value="{StaticResource DefaultDataGridCellStyle}" />
<Setter Property="ColumnHeaderStyle" Value="{StaticResource DefaultDataGridColumnHeaderStyle}" />
<Setter Property="DropLocationIndicatorStyle" Value="{StaticResource DefaultDataGridDropLocationIndicatorStyle}" />
<Setter Property="RowHeaderStyle" Value="{StaticResource DefaultDataGridRowHeaderStyle}" />
<Setter Property="Background" Value="{DynamicResource BackgroundLayoutBrush}" />
<Setter Property="Foreground" Value="{DynamicResource TextPrimaryBrush}" />
<Setter Property="HorizontalGridLinesBrush" Value="{DynamicResource BorderNormalBrush}" />
<Setter Property="VerticalGridLinesBrush" Value="{DynamicResource BorderNormalBrush}" />
<Setter Property="FontSize" Value="14" />
<Setter Property="BorderBrush" Value="{DynamicResource BorderNormalBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="RowDetailsVisibilityMode" Value="VisibleWhenSelected" />
<Setter Property="ScrollViewer.CanContentScroll" Value="True" />
<Setter Property="ScrollViewer.PanningMode" Value="Both" />
<Setter Property="Stylus.IsFlicksEnabled" Value="False" />
<Setter Property="assists:DataGridAssist.TextColumnStyle">
<Setter.Value>
<Style TargetType="TextBlock">
<Setter Property="Padding" Value="4,2" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</Setter.Value>
</Setter>
<Setter Property="assists:DataGridAssist.EditingTextColumnStyle" Value="{DynamicResource FlattenTextBoxStyle}" />
<Setter Property="assists:DataGridAssist.CheckBoxColumnStyle" Value="{StaticResource DataGridCheckBoxStyle}" />
<Setter Property="assists:DataGridAssist.EditingCheckBoxColumnStyle" Value="{StaticResource DataGridCheckBoxStyle}" />
<Setter Property="assists:DataGridAssist.ComboBoxColumnStyle" Value="{DynamicResource ComboBoxPreviewStyle}" />
<Setter Property="assists:DataGridAssist.EditingComboBoxColumnStyle" Value="{DynamicResource FlattenComboBoxStyle}" />
<Setter Property="assists:DataGridAssist.ApplyDefaultStyle" Value="True" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGrid}">
<Border
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="4"
Padding="{TemplateBinding Padding}"
SnapsToDevicePixels="True">
<ScrollViewer Focusable="False" x:Name="DG_ScrollViewer">
<ScrollViewer.Template>
<ControlTemplate TargetType="{x:Type ScrollViewer}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Button
Command="{x:Static DataGrid.SelectAllCommand}"
Focusable="False"
Style="{DynamicResource {ComponentResourceKey ResourceId=DataGridSelectAllButtonStyle,
TypeInTargetAssembly={x:Type DataGrid}}}"
Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.All}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
Width="{Binding CellsPanelHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" />
<DataGridColumnHeadersPresenter
Grid.Column="1"
Grid.Row="0"
Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Column}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
x:Name="PART_ColumnHeadersPresenter" />
<ScrollContentPresenter
CanContentScroll="{TemplateBinding CanContentScroll}"
Grid.Column="0"
Grid.ColumnSpan="2"
Grid.Row="1"
x:Name="PART_ScrollContentPresenter" />
<ScrollBar
Grid.Column="2"
Grid.Row="1"
Maximum="{TemplateBinding ScrollableHeight}"
Orientation="Vertical"
Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"
ViewportSize="{TemplateBinding ViewportHeight}"
Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"
x:Name="PART_VerticalScrollBar" />
<Grid Grid.Column="1" Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding NonFrozenColumnsViewportHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<ScrollBar
Grid.Column="1"
Maximum="{TemplateBinding ScrollableWidth}"
Orientation="Horizontal"
Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"
ViewportSize="{TemplateBinding ViewportWidth}"
Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"
x:Name="PART_HorizontalScrollBar" />
</Grid>
</Grid>
</ControlTemplate>
</ScrollViewer.Template>
<ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
</ScrollViewer>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsGrouping" Value="True" />
<Condition Property="VirtualizingPanel.IsVirtualizingWhenGrouping" Value="False" />
</MultiTrigger.Conditions>
<Setter Property="ScrollViewer.CanContentScroll" Value="False" />
</MultiTrigger>
</Style.Triggers>
</Style>
<!-- 整体数据网格样式 -->
<Style TargetType="{x:Type DataGrid}" x:Key="CheckBoxHeadDataGridStyle">
<Setter Property="RowStyle" Value="{StaticResource DefaultDataGridRowStyle}" />
<Setter Property="CellStyle" Value="{StaticResource DefaultDataGridCellStyle}" />
<Setter Property="ColumnHeaderStyle" Value="{StaticResource DefaultDataGridColumnHeaderStyle}" />
<Setter Property="DropLocationIndicatorStyle" Value="{StaticResource DefaultDataGridDropLocationIndicatorStyle}" />
<Setter Property="RowHeaderStyle" Value="{StaticResource DefaultDataGridRowHeaderStyle}" />
<Setter Property="Background" Value="{DynamicResource BackgroundLayoutBrush}" />
<Setter Property="Foreground" Value="{DynamicResource TextPrimaryBrush}" />
<Setter Property="HorizontalGridLinesBrush" Value="{DynamicResource BorderNormalBrush}" />
<Setter Property="VerticalGridLinesBrush" Value="{DynamicResource BorderNormalBrush}" />
<Setter Property="FontSize" Value="14" />
<Setter Property="BorderBrush" Value="{DynamicResource BorderNormalBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="RowDetailsVisibilityMode" Value="VisibleWhenSelected" />
<Setter Property="ScrollViewer.CanContentScroll" Value="True" />
<Setter Property="ScrollViewer.PanningMode" Value="Both" />
<Setter Property="Stylus.IsFlicksEnabled" Value="False" />
<Setter Property="assists:DataGridAssist.TextColumnStyle">
<Setter.Value>
<Style TargetType="TextBlock">
<Setter Property="Padding" Value="4,2" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</Setter.Value>
</Setter>
<Setter Property="assists:DataGridAssist.EditingTextColumnStyle" Value="{DynamicResource FlattenTextBoxStyle}" />
<Setter Property="assists:DataGridAssist.CheckBoxColumnStyle" Value="{StaticResource DataGridCheckBoxStyle}" />
<Setter Property="assists:DataGridAssist.EditingCheckBoxColumnStyle" Value="{StaticResource DataGridCheckBoxStyle}" />
<Setter Property="assists:DataGridAssist.ComboBoxColumnStyle" Value="{DynamicResource ComboBoxPreviewStyle}" />
<Setter Property="assists:DataGridAssist.EditingComboBoxColumnStyle" Value="{DynamicResource FlattenComboBoxStyle}" />
<Setter Property="assists:DataGridAssist.ApplyDefaultStyle" Value="True" />
<Setter Property="RowHeaderTemplate">
<Setter.Value>
<DataTemplate>
<CheckBox IsChecked="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=DataGridRow}}" />
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGrid}">
<decorations:EmbossBorder
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="4"
Padding="{TemplateBinding Padding}"
SnapsToDevicePixels="True">
<ScrollViewer Focusable="False" x:Name="DG_ScrollViewer">
<ScrollViewer.Template>
<ControlTemplate TargetType="{x:Type ScrollViewer}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Button
Command="{x:Static DataGrid.SelectAllCommand}"
Focusable="False"
Style="{DynamicResource {ComponentResourceKey ResourceId=DataGridSelectAllButtonStyle,
TypeInTargetAssembly={x:Type DataGrid}}}"
Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.All}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
Width="{Binding CellsPanelHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" />
<DataGridColumnHeadersPresenter
Grid.Column="1"
Grid.Row="0"
Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Column}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
x:Name="PART_ColumnHeadersPresenter" />
<ScrollContentPresenter
CanContentScroll="{TemplateBinding CanContentScroll}"
Grid.Column="0"
Grid.ColumnSpan="2"
Grid.Row="1"
x:Name="PART_ScrollContentPresenter" />
<ScrollBar
Grid.Column="2"
Grid.Row="1"
Maximum="{TemplateBinding ScrollableHeight}"
Orientation="Vertical"
Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"
ViewportSize="{TemplateBinding ViewportHeight}"
Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"
x:Name="PART_VerticalScrollBar" />
<Grid Grid.Column="1" Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding NonFrozenColumnsViewportHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<ScrollBar
Grid.Column="1"
Maximum="{TemplateBinding ScrollableWidth}"
Orientation="Horizontal"
Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"
ViewportSize="{TemplateBinding ViewportWidth}"
Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"
x:Name="PART_HorizontalScrollBar" />
</Grid>
</Grid>
</ControlTemplate>
</ScrollViewer.Template>
<ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
</ScrollViewer>
</decorations:EmbossBorder>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsGrouping" Value="True" />
<Condition Property="VirtualizingPanel.IsVirtualizingWhenGrouping" Value="False" />
</MultiTrigger.Conditions>
<Setter Property="ScrollViewer.CanContentScroll" Value="False" />
</MultiTrigger>
</Style.Triggers>
</Style>
<Style BasedOn="{StaticResource DefaultDataGridStyle}" TargetType="DataGrid" />
<Style BasedOn="{StaticResource DefaultDataGridStyle}" TargetType="{x:Type controls:NeuDataGrid}">
<Setter Property="CanUserAddRows" Value="False" />
<Setter Property="RowHeaderTemplate">
<Setter.Value>
<DataTemplate>
<Grid>
<!-- 默认显示行号的TextBlock -->
<TextBlock
HorizontalAlignment="Center"
Text="{Binding RelativeSource={RelativeSource AncestorType=DataGridRow}, Path=Header}"
VerticalAlignment="Center" />
<!-- 当有验证错误时,显示一个红色的感叹号 -->
<TextBlock
FontSize="16"
FontWeight="Bold"
Foreground="Red"
HorizontalAlignment="Center"
Text="!"
ToolTip="{Binding RelativeSource={RelativeSource AncestorType=DataGridRow}, Path=(Validation.Errors).CurrentItem.ErrorContent}"
VerticalAlignment="Center"
Visibility="Collapsed"
x:Name="ErrorIcon" />
</Grid>
<DataTemplate.Triggers>
<!-- 当行的Validation.HasError为True时触发器会将感叹号显示出来 -->
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=DataGridRow}, Path=(Validation.HasError)}" Value="True">
<Setter Property="Visibility" TargetName="ErrorIcon" Value="Visible" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>