代码之家  ›  专栏  ›  技术社区  ›  Jake Wharton

wpf datagrid headertemplate神秘填充

  •  3
  • Jake Wharton  · 技术社区  · 15 年前

    我将在数据报列的标题中放置一个带有图像的单个按钮。单元模板也是一个带有图像的简单按钮。

    <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的填充,这只会导致单元格以该宽度呈现,使单元格按钮两侧都有空白。作为一个像素完美主义者,这让我恼火。我最初以为它是排序时显示箭头的空间,但我在整个数据报和列上都禁用了排序。

    这里有一个形象: 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 回复  |  直到 15 年前
        1
  •  3
  •   Anvaka    15 年前

    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…即使他们不使用标准的填充物,他们也会让孩子稍微移动一下。

    如何解决这个问题?也许为表头编写自己的模板可以做到这一点。或者你可以试试图像的负边缘。这两种方法都不喜欢。但我还没找到更好的。

        2
  •  1
  •   khippytch    11 年前

    使用padding=“0,0.000001,0,0”似乎可以绕过检查代码并工作(至少在.NET 4.0中)。