在WPF中,我使用自定义ColumnHeaderStyle ...
<DataGrid.ColumnHeaderStyle>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
<Border Background="#3ec9ed"
BorderBrush="Black"
BorderThickness="0"
Padding="10"
CornerRadius="25">
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center"
Margin="5,0,5,0" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Foreground"
Value="White" />
<Setter Property="HorizontalContentAlignment"
Value="Center" />
<Setter Property="Padding"
Value="15" />
<Setter Property="SeparatorBrush"
Value="Red" />
<Setter Property="SeparatorVisibility"
Value="Visible" />
</Style>
</DataGrid.ColumnHeaderStyle>
现在看起来是这样的。
我想在每个列标题之间添加一点空间。就像这样
我能做些什么来实现这一目标?
1条答案
按热度按时间hvvq6cgz1#
DataGrid
将所有列标题 Package 到一个通用的顶级DataGridColumnHeader
容器中(它基本上是一个包含各个列标题的大的单列)。当您通过全局
Style
设置DataGridColumnHeader.Background
时,该值也适用于这个外部容器,这实际上会使列标题之间的间隙消失(因为它们共享相同的Background
)。解决方案是将此顶级列的
Background
设置为例如。Brushes.Transparent
。顶层列通常具有-1
的DataGridColumnHeader.DisplayIndex
。这允许我们使用模板
Trigger
来处理这个特殊列。您还必须将模板元素正确地连接到模板化的父元素,以允许
DataGridColumnHeader
属性(如Background
或Margin
)按预期行为(即对布局有任何影响)。您通常使用TemplateBinding
标记扩展来实现此目的。为了允许单独设置第一个和最后一个项目的边框,您需要一个带有自定义
IMultiValueConverter
的MultiBinding
,以便检测最后一个项目/列。下面示例中的
ItemIndexComparerConverter
允许使用Index表示法指定感兴趣项的索引(例如,^1
引用最后一项,1
引用第二项)。只需将索引传递给MultiBinding.ConverterParameter
属性。固定和改进的
Style
在10 DIP的列之间应用间隙(Margin
左右5 DIP),如下所示:当
MultiBinding.ConverterParameter
的Index
引用值等于项的索引时返回true
的转换器,否则返回false
。所需的输入(通过
MultiBinding
)是当前项的索引和相关项源集合的ItemsControl
。