2008-11-28 16 views

Respuesta

7

Aunque DataGrid no expone una propiedad de Fondo de encabezado, sí tiene una propiedad para ColumnHeaderStyle. Usando la técnica que DaniCE ha sugerido previamente para una sola columna, podemos reemplazar la plantilla de encabezado para todas las columnas de encabezado, incluido el espacio vacío en el lado derecho. El inconveniente de reemplazar toda la plantilla por un encabezado es que perdemos las flechas de clasificación y los separadores que están presentes en la plantilla de encabezado predeterminada. Afortunadamente podemos usar un template browser para extraer la plantilla predeterminada que se está utilizando y luego modificar una copia de la misma.

Aquí he reunido un ejemplo rápido que cambiará el fondo de los encabezados de las columnas a LightBlue mientras mantiene los separadores y la clasificación. Eche un vistazo a la plantilla DataGridColumnHeader predeterminada en un template browser para ver cómo hacer frente a la modificación del Fondo cuando el mouse se cierne sobre el ColumnHeader.

DataGrid Header Background http://i34.tinypic.com/2q2ixch.jpg

<data:DataGrid x:Name="grid"> 
    <data:DataGrid.ColumnHeaderStyle> 
     <Style 
      xmlns:primitives="clr-namespace:System.Windows.Controls.Primitives;assembly=System.Windows.Controls.Data" 
      xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows" 
      TargetType="primitives:DataGridColumnHeader" > 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="primitives:DataGridColumnHeader"> 
         <Grid Name="Root"> 
          <vsm:VisualStateManager.VisualStateGroups> 
           <vsm:VisualStateGroup x:Name="SortStates" > 
            <vsm:VisualStateGroup.Transitions> 
             <vsm:VisualTransition GeneratedDuration="00:00:0.1" /> 
            </vsm:VisualStateGroup.Transitions> 
            <vsm:VisualState x:Name="Unsorted" /> 
            <vsm:VisualState x:Name="SortAscending"> 
             <Storyboard> 
              <DoubleAnimation Storyboard.TargetName="SortIcon" Storyboard.TargetProperty="Opacity" Duration="0" To="1.0" /> 
             </Storyboard> 
            </vsm:VisualState> 
            <vsm:VisualState x:Name="SortDescending"> 
             <Storyboard> 
              <DoubleAnimation Storyboard.TargetName="SortIcon" Storyboard.TargetProperty="Opacity" Duration="0" To="1.0" /> 
              <DoubleAnimation Storyboard.TargetName="SortIconTransform" Storyboard.TargetProperty="ScaleY" Duration="0" To="-.9" /> 
             </Storyboard> 
            </vsm:VisualState> 
           </vsm:VisualStateGroup> 
          </vsm:VisualStateManager.VisualStateGroups> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="*" /> 
           <RowDefinition Height="*" /> 
           <RowDefinition Height="Auto" /> 
          </Grid.RowDefinitions> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="Auto" /> 
           <ColumnDefinition Width="*" /> 
           <ColumnDefinition Width="Auto" /> 
          </Grid.ColumnDefinitions> 
          <Rectangle x:Name="BackgroundRectangle" Stretch="Fill" Fill="LightBlue" Grid.ColumnSpan="2" Grid.RowSpan="2" /> 
          <ContentPresenter Grid.RowSpan="2" Content="{TemplateBinding Content}" Cursor="{TemplateBinding Cursor}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Margin="{TemplateBinding Padding}" /> 
          <Rectangle Name="VerticalSeparator" Grid.RowSpan="2" Grid.Column="2" Width="1" VerticalAlignment="Stretch" Fill="{TemplateBinding SeparatorBrush}" Visibility="{TemplateBinding SeparatorVisibility}" /> 
          <Path Grid.RowSpan="2" Name="SortIcon" RenderTransformOrigin=".5,.5" HorizontalAlignment="Left" VerticalAlignment="Center" Opacity="0" Grid.Column="1" Stretch="Uniform" Width="8" Data="F1 M -5.215,6.099L 5.215,6.099L 0,0L -5.215,6.099 Z "> 
           <Path.Fill> 
            <SolidColorBrush Color="#FF444444" /> 
           </Path.Fill> 
           <Path.RenderTransform> 
            <TransformGroup> 
             <ScaleTransform x:Name="SortIconTransform" ScaleX=".9" ScaleY=".9" /> 
            </TransformGroup> 
           </Path.RenderTransform> 
          </Path> 
         </Grid> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </data:DataGrid.ColumnHeaderStyle> 
</data:DataGrid> 

Espero que esto ayude!

+0

¡Eso fue extremadamente útil David! – ScottG

+0

Lamentablemente esto no centra allign el texto del encabezado ... a pesar de que he intentado todo – user1034912

1

Se me ocurrió una solución "Limpia" ... Espero que funcione para usted. Simplemente anulo el DataGrid y expuse el método GetTemplateChild. El uso que se puede acceder al DataGridColumnHeaderPresenter y los DataGridColumnHeaders contenidas en ella ...

1) Anular cuadrícula de datos

/// <summary> 
/// Extends the DataGrid so that it's possible to access the template objects 
/// </summary> 
public class DataGridEx : System.Windows.Controls.DataGrid 
{ 
    /// <summary> 
    /// Exposes Template items 
    /// </summary> 
    public Object GetTemplateObject(String name) 
    { 
     return this.GetTemplateChild(name); 
    } 
} 

2) Cambiar el fondo

DataGridEx rejilla = new DataGridEx();

... después se aplica la plantilla ...

DataGridColumnHeadersPresenter obj = DataGrid.GetTemplateObject ("ColumnHeadersPresenter") como DataGridColumnHeadersPresenter;

DataGridColumnHeader h = obj.Children [0] como DataGridColumnHeader;

h.Background = new SolidColorBrush (Colors.Red);

Cuestiones relacionadas