WPF数据表头模板神秘的填充问题

3
我正在将一个带有图像的单个按钮放置在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-15像素的填充,这会导致单元格以该宽度明显呈现,使单元格按钮两侧留有空白。作为一个完美主义者,这让我非常烦恼。最初我认为这是用于排序时显示的箭头的空间,但我已在整个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>
2个回答

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时...即使他们没有使用标准Padding,他们也会稍微移动子元素。

怎么解决?也许编写自己的表头模板可以解决问题。或者您可以尝试对图像使用负边距。我都不喜欢这些方法。但是我还没有找到更好的解决方案。


这让我看到它发生在DataGridHeaderBorder中,它持有ContentPresenterButton的父级)。没有任何属性表明填充的来源。唉。 - Jake Wharton
请查看原帖中发布的屏幕截图。 - Jake Wharton
谢谢!解决方案已经发布在上面了。 - Jake Wharton
太好了 :)!我很高兴你找到了它!干杯。 - Anvaka

3

使用Padding="0,0.000001,0,0"似乎可以绕过它们的检查代码,并且可以正常工作(至少在.NET 4.0中)。


我使用了<Setter Property="Padding" Value="0,0.000001,0,0" /> - 我可以确认这个解决方法适用于.NET 4.5和Visual Studio 2017。 - Jinjinov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接