从控件的默认样式继承样式

时间:2014-12-27 06:46:55

标签: wpf xaml datagrid wpf-style

标题说明了一切。如何在仍然继承我不覆盖的属性的默认样式值的同时在DataGrid的列标题中应用自定义样式?我已经尝试过this SO post中给出的方法,但它似乎并不适用于我的情况。我的列标题看起来与默认标题略有不同。这是我的XAML:

<Style TargetType="DataGridColumnHeader" BasedOn="{StaticResource {x:Type DataGridColumnHeader}}">
    <Setter Property="BorderBrush" Value="Black" />
    <Setter Property="BorderThickness" Value="0,0,1,0" />
</Style>

这是输出:

enter image description here

如您所见,左列(具有自定义样式)没有填充,与具有默认样式的右列不同。有线索吗?

(我当然可以在我的风格中设置填充以获得我想要的外观;我只需要知道为什么它没有继承默认控件样式的填充。)

重现错误的示例代码

<Window x:Class="Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
  <Grid>
    <DataGrid AutoGenerateColumns="False">
      <DataGrid.Columns>
        <DataGridTextColumn Width="100" Header="No Padding">
          <DataGridTextColumn.HeaderStyle>
            <Style TargetType="DataGridColumnHeader" BasedOn="{StaticResource {x:Type DataGridColumnHeader}}">
              <Setter Property="BorderBrush" Value="Black" />
              <Setter Property="BorderThickness" Value="0,0,1,0" />
            </Style>
          </DataGridTextColumn.HeaderStyle>
        </DataGridTextColumn>
        <DataGridTextColumn Width="100" Header="Padding" />
      </DataGrid.Columns>
    </DataGrid>
  </Grid>
</Window>

1 个答案:

答案 0 :(得分:0)

我使用Blend检查DataGridColumnHeader的Template。我注意到在Template中使用的是DataGridHeaderBorder,它派生自Border。
http://msdn.microsoft.com/en-us/library/microsoft.windows.themes.datagridheaderborder(v=vs.110).aspx
有注释&#34;如果在DataGrid上设置了Background或BorderBrush属性,则渲染将恢复为默认的Border实现。&#34;它解释了你的问题。
DataGridHeaderBorder重写OnRender方法并根据Background或BorderBrush是否为null呈现不同的标头。在一种情况下,OnRender方法添加Padding,而在第二种情况下不添加。
http://referencesource.microsoft.com/#PresentationFramework.Aero/DataGridHeaderBorder.cs,257