WPF DataGrid HeaderTemplate神秘填充

我将带有图像的单个按钮放在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

我认为这是从按钮的父元素填充的内容.有谁知道消除它的方法?

看到:

> http://img704.imageshack.us/i/23206794.png/
> http://img229.imageshack.us/i/65917762.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>

解决方法:

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的地方…即使他们不使用标准的Padding,他们也会将孩子稍微移动一点.

如何解决这个问题?也许为表头编写自己的模板可以解决问题.或者,您可以尝试为图像添加负边距.不喜欢这两种方法.但是我还找不到更好的东西.

上一篇:C#-从匿名对象获取值


下一篇:CodeGo.net>如何更改WPF的DataGrid单元格小部件背景颜色根据单元格的背景颜色?