【问题标题】:WPF DataGrid HeaderTemplate Mysterious PaddingWPF DataGrid HeaderTemplate 神秘填充
【发布时间】:2011-03-01 09:11:46
【问题描述】:

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

【问题讨论】:

    标签: c# .net wpf datagrid


    【解决方案1】:

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

    【讨论】:

    • 我使用了 &lt;Setter Property="Padding" Value="0,0.000001,0,0" /&gt; - 我可以使用 .NET 4.5 和 Visual Studio 2017 确认此解决方法。
    【解决方案2】:

    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 的父级)。没有任何属性指示填充的来源。呃。
    • 查看原帖中的截图。
    • 谢谢!上面发布的解决方案。
    • 优秀:)!我很高兴你找到了!干杯。