2008-11-28 3 views

답변

7

DataGrid는 머리글 배경 속성을 노출하지 않지만 ColumnHeaderStyle 속성이 있습니다. DaniCE가 이전에 단일 열에 제안한 기법을 사용하여 오른쪽의 빈 공간을 포함하여 모든 머리글 열에 대한 머리글 템플릿을 바꿀 수 있습니다. 헤더의 전체 템플리트를 바꾸는 단점은 기본 헤더 템플리트에있는 정렬 화살표와 구분 기호가 손실된다는 것입니다. 다행히도 template browser을 사용하여 기본 템플릿을 추출한 다음 해당 템플릿을 수정할 수 있습니다.

구분 기호 및 정렬을 유지하면서 열 머리글의 배경을 LightBlue로 변경하는 빠른 예제를 작성했습니다. template browser에있는 기본 DataGridColumnHeader 템플릿을 살펴보면 마우스가 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> 

희망!

+0

David는 매우 도움이되었습니다. – ScottG

+0

불행히도 이것은 헤더 텍스트를 정렬하지 않습니다. – user1034912

1

나는 "깨끗한"해결책을 찾았습니다. 잘하면 그것은 당신을 위해 작동합니다. DataGrid를 단순히 재정의하고 GetTemplateChild 메서드를 노출했습니다. 배경을

DataGridEx 그리드 = 새로운 DataGridEx 변경)

1) 재정의 데이터 그리드

/// <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); 
    } 
} 

이 ... 당신이 DataGridColumnHeaderPresenter 그 안에 포함 된 DataGridColumnHeaders에 액세스 할 수 있습니다를 사용하여(); 템플릿이 적용된 후

...

DataGridColumnHeadersPresenter OBJ = DataGrid.GetTemplateObject DataGridColumnHeadersPresenter 등 ("ColumnHeadersPresenter");

DataGridColumnHeader h = obj.Children as [DataGridColumnHeader as];

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

관련 문제