我在DataGrid列的标题中放置了一个带有图像的按钮。单元格模板也只是一个带图像的简单按钮。
<my:DataGridTemplateColumn>
<my:DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<Button ToolTip="Add New Template" Name="AddNewTemplate" Click="AddNewTemplate_Click">
<Image Source="../Resources/add.png"/>
</Button>
</DataTemplate>
</my:DataGridTemplateColumn.HeaderTemplate>
<my:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button ToolTip="Edit Template" Name="EditTemplate" Click="EditTemplate_Click" Tag="{Binding}">
<Image Source="../Resources/pencil.png"/>
</Button>
</DataTemplate>
</my:DataGridTemplateColumn.CellTemplate>
</my:DataGridTemplateColumn>
渲染时,标题在右侧只有大约10-15px的填充,这导致单元格明显呈现在该宽度,使得单元格按钮两侧都有空白区域。作为一个像素完美主义者,这让我感到懊恼。我最初认为它是排序时显示的箭头的空间,但我在整个DataGrid上显式禁用了排序,并且在列上显式禁用。
这是一张图片: http://img716.imageshack.us/img716/1787/68487749.png
我认为这是来自按钮的父元素的填充。有没有人知道消除它的方法?
请参阅:
解决方案:
<my:DataGrid.Resources>
<Style x:Key="addHeader" TargetType="{x:Type myp:DataGridColumnHeader}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type myp:DataGridColumnHeader}">
<Button ToolTip="Add New Template" Name="AddNewTemplate" Click="AddNewTemplate_Click" Margin="4">
<Image Source="../Resources/add.png"/>
</Button>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</my:DataGrid.Resources>
<my:DataGrid.Columns>
<my:DataGridTemplateColumn HeaderStyle="{StaticResource addHeader}">
<my:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button ToolTip="Edit Template" Name="EditTemplate" Click="EditTemplate_Click" Tag="{Binding}">
<Image Source="../Resources/pencil.png"/>
</Button>
</DataTemplate>
</my:DataGridTemplateColumn.CellTemplate>
</my:DataGridTemplateColumn>
</my:DataGrid.Columns>
答案 0 :(得分:3)
Snoop救援!
现在您更新了问题,我在DataGridHeaderBorder.cs中找到了一个有趣的代码:
protected override Size ArrangeOverride(Size arrangeSize)
{
//...
if (padding.Equals(new Thickness()))
{
padding = DefaultPadding;
}
//...
child.Arrange(new Rect(padding.Left, padding.Top, childWidth, childHeight));
}
DefaultPadding不为0 ...即使他们不使用标准填充,他们也会安排孩子稍微移动。
如何解决这个问题?也许为表头编写自己的模板就可以了。或者您可以尝试图像的负边距。不喜欢这种方法。但我找不到更好的东西了。
答案 1 :(得分:1)
使用Padding =“0,0.000001,0,0”似乎绕着它们的检查代码行走(至少在.NET 4.0中)。