2008-11-28 39 views

Trả lời

7

Mặc dù DataGrid không hiển thị thuộc tính Nền đầu trang, nhưng nó có thuộc tính cho ColumnHeaderStyle. Sử dụng kỹ thuật mà DaniCE đã đề xuất trước đây cho một cột đơn, chúng tôi có thể thay thế mẫu tiêu đề cho tất cả các cột tiêu đề bao gồm khoảng trống ở phía bên tay phải. Phía dưới cùng với việc thay thế toàn bộ khuôn mẫu cho tiêu đề là chúng ta mất các mũi tên sắp xếp và dấu phân tách có mặt trong mẫu tiêu đề mặc định. May mắn là chúng ta có thể sử dụng template browser để trích xuất mẫu mặc định đang được sử dụng và sau đó sửa đổi một bản sao của nó.

Ở đây tôi đã cùng nhau đưa ra một ví dụ nhanh sẽ thay đổi nền của các tiêu đề cột thành LightBlue trong khi vẫn giữ các dấu phân tách và sắp xếp. Hãy xem mẫu DataGridColumnHeader mặc định trong một template browser để xem cách xử lý việc sửa đổi Nền khi chuột di chuột qua 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> 

Hope this helps!

+0

Đó là David vô cùng hữu ích! – ScottG

+0

Thật không may điều này không trung tâm allign văn bản tiêu đề .. mặc dù tôi đã cố gắng tất cả mọi thứ – user1034912

1

Tôi đã đưa ra giải pháp "Sạch". Hy vọng nó phù hợp với bạn. Tôi chỉ đơn giản là ghi đè lên DataGrid và tôi tiếp xúc với phương thức GetTemplateChild. Sử dụng nó, bạn có thể truy cập vào DataGridColumnHeaderPresenter và DataGridColumnHeaders chứa trong nó ...

1) Override 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) Thay đổi nền

DataGridEx lưới = new DataGridEx();

... sau khi mẫu được áp dụng ...

DataGridColumnHeadersPresenter obj = DataGrid.GetTemplateObject ("ColumnHeadersPresenter") như DataGridColumnHeadersPresenter;

DataGridColumnHeader h = obj.Children [0] dưới dạng DataGridColumnHeader;

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

Các vấn đề liên quan