2010-06-08 86 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