2008-11-28 7 views

Antwort

7

Obwohl das DataGrid keine Header-Hintergrundeigenschaft verfügbar macht, verfügt es über eine Eigenschaft für den ColumnHeaderStyle. Mit der Technik, die DaniCE zuvor für eine einzelne Spalte vorgeschlagen hat, können wir die Header-Vorlage für alle Header-Spalten einschließlich des leeren Platzes auf der rechten Seite ersetzen. Der Nachteil beim Ersetzen der gesamten Vorlage für eine Kopfzeile ist, dass wir die Sortierpfeile und Trennzeichen verlieren, die in der Standardkopfzeilenvorlage vorhanden sind. Glücklicherweise können wir eine template browser verwenden, um die verwendete Standardvorlage zu extrahieren und dann eine Kopie davon zu ändern.

Hier habe ich ein schnelles Beispiel zusammengestellt, das den Hintergrund der Spaltenüberschriften in LightBlue ändert, während die Separatoren und Sortierung beibehalten werden. Sehen Sie sich die Standardvorlage DataGridColumnHeader in einer template browser an, um zu sehen, wie Sie mit dem Ändern des Hintergrunds umgehen, wenn Sie den Mauszeiger über den ColumnHeader bewegen.

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> 

hoffe, das hilft!

+0

Das war extrem hilfreich David! – ScottG

+0

Leider zentriert das nicht den Headertext .. obwohl ich alles versucht habe – user1034912

1

Ich kam mit einer "Clean" -Lösung .. Hoffentlich funktioniert es für Sie. Ich überschreibe einfach das DataGrid und ich legte die GetTemplateChild-Methode. Mit ihm können Sie den DataGridColumnHeaderPresenter zugreifen und die darin enthaltenen DataGridColumnHeaders ...

1) außer Kraft setzen Datagrid

/// <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) Ändern Sie den Hintergrund

DataGridEx grid = new DataGridEx();

... nachdem die Vorlage angewendet wird ...

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

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

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