2016-08-23 1 views
0

Warum hat der Header im folgenden Fenster eine Auffüllung von 2/3, obwohl ich ihn explizit mit dem folgenden Code auf 0 setze? (Und kann es als 0 in Snoop sehen):WPF DataGrid Strange Header Padding-Verhalten

<DataGridTemplateColumn.HeaderStyle> 
    <Style TargetType="DataGridColumnHeader"> 
     <Setter Property="Padding" Value="0" /> 
     <Setter Property="Margin" Value="0" /> 
    </Style> 
</DataGridTemplateColumn.HeaderStyle> 

Das gibt mir die folgende (Kopfpolster hat):

enter image description here

Aber sobald ich es auf etwas anderes ändern als 0 zB:

<DataGridTemplateColumn.HeaderStyle> 
    <Style TargetType="DataGridColumnHeader"> 
     <Setter Property="Padding" Value="0,1" /> 
     <Setter Property="Margin" Value="0" /> 
    </Style> 
</DataGridTemplateColumn.HeaderStyle> 

Die Polsterung nicht auf Standard gesetzt bekommt. Ich nehme an, dass irgendwo in der WPF-Bibliothek Code ist?

enter image description here

Hat jemand über diese kommen vor und herausgefunden, warum, bevor ich einen Nachmittag herauszufinden, warum verbringen?

Full Test Code:

<Window x:Class="WpfApplication1.GridSpacing" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:system="clr-namespace:System;assembly=mscorlib" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <DataGrid> 
      <DataGrid.Items> 
       <system:String>Test</system:String> 
      </DataGrid.Items> 
      <DataGrid.Columns> 
       <DataGridTemplateColumn> 
        <DataGridTemplateColumn.HeaderTemplate> 
         <DataTemplate> 
          <TextBlock Text="Test" 
             Background="Aquamarine" 
             HorizontalAlignment="Stretch" 
             VerticalAlignment="Stretch"/> 
         </DataTemplate> 
        </DataGridTemplateColumn.HeaderTemplate> 
        <DataGridTemplateColumn.HeaderStyle> 
         <Style TargetType="DataGridColumnHeader"> 
          <Setter Property="Padding" Value="0" /> 
         </Style> 
        </DataGridTemplateColumn.HeaderStyle> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
           <TextBlock Text="Test" Background="Aquamarine"/> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 
</Window> 

Antwort

0

Sie es sehen können DataGridHeaderBorder über dem ContentPresenter ist Live-ViusalTree in VS2015 verwenden.

enter image description here

Die DataGridHeaderBorder ist das Problem. Sie können diese answer verweisen. In der DataGridHeaderBorder.cs,

/// <summary> 
///  Positions children and returns the final size of the element. 
/// </summary> 
protected override Size ArrangeOverride(Size arrangeSize) 
{ 
    if (UsingBorderImplementation) 
    { 
     // Revert to the Border implementation 
     return base.ArrangeOverride(arrangeSize); 
    } 

    UIElement child = Child; 
    if (child != null) 
    { 
     // Use the public Padding property if it's set 
     Thickness padding = Padding; 
     if (padding.Equals(new Thickness())) 
     { 
      padding = DefaultPadding; 
     } 

     // Reserve space for the chrome 
     double childWidth = Math.Max(0.0, arrangeSize.Width - padding.Left - padding.Right); 
     double childHeight = Math.Max(0.0, arrangeSize.Height - padding.Top - padding.Bottom); 

     child.Arrange(new Rect(padding.Left, padding.Top, childWidth, childHeight)); 
    } 

    return arrangeSize; 
}