2010-06-08 83 views
3

我在DataGrid的列的标题中放置一个带有图像的按钮。单元格模板也只是一个带图片的简单按钮。WPF DataGrid HeaderTemplate神秘填充

<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> 

回答

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 ...即使他们不使用标准的填充他们安排微微动了孩子。

如何解决这一问题?也许编写自己的表头模板将做到这一点。或者你可以尝试图像的负边距。不喜欢这种方法。但是我还找不到更好的东西。

+0

这让我发现它出现在DataGridHeaderBorder中,它持有ContentPresenter(Button的父亲)。没有任何属性指示填充起点的位置。啊。 – 2010-06-09 12:35:37

+0

查看原贴中张贴的截图。 – 2010-06-09 12:54:06

+0

更新了答案。 – Anvaka 2010-06-09 13:12:07

1

使用Padding =“0,0.000001,0,0”似乎绕着他们的检查代码工作(至少在.NET 4.0中)。

+0

我用'' - 我可以用.NET 4.5和Visual Studio 2017来证实这个解决方法。 – JinJi 2018-01-31 12:35:24