2010-03-21 13 views
6

estoy tratando de personalizar los encabezados de columna de una cuadrícula de datos para mostrar los encabezados de sub-columna como en la siguiente captura de pantalla:¿Cómo personalizar y reutilizar un estilo DataGridColumnHeader?

alt text http://img297.imageshack.us/img297/464/columnheaders.gif

que he hecho un estilo de 2 sub-columnas como en el siguiente XAML:

<UserControl 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" 
xmlns:primitives="clr-namespace:System.Windows.Controls.Primitives;assembly=System.Windows.Controls.Data" 
xmlns:sl="clr-namespace:UI" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" x:Class="UI.ColumnHeaderGrid" 
mc:Ignorable="d"> 
<UserControl.Resources> 
    <Style x:Key="SplitColumnHeaderStyle" TargetType="primitives:DataGridColumnHeader"> 
     <Setter Property="Foreground" Value="#FF000000"/> 
     <Setter Property="HorizontalContentAlignment" Value="Center"/> 
     <Setter Property="VerticalContentAlignment" Value="Center"/> 
     <Setter Property="IsTabStop" Value="False"/> 
     <Setter Property="SeparatorBrush" Value="#FFC9CACA"/> 
     <Setter Property="Padding" Value="4"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="primitives:DataGridColumnHeader"> 
        <Grid x:Name="Root"> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition/> 
          <ColumnDefinition Width="Auto"/> 
         </Grid.ColumnDefinitions> 
         <Rectangle x:Name="BackgroundRectangle" Fill="#FF1F3B53" Stretch="Fill" Grid.ColumnSpan="2"/> 
         <Rectangle x:Name="BackgroundGradient" Stretch="Fill" Grid.ColumnSpan="2"> 
          <Rectangle.Fill> 
           <LinearGradientBrush EndPoint=".7,1" StartPoint=".7,0"> 
            <GradientStop Color="#FCFFFFFF" Offset="0.015"/> 
            <GradientStop Color="#F7FFFFFF" Offset="0.375"/> 
            <GradientStop Color="#E5FFFFFF" Offset="0.6"/> 
            <GradientStop Color="#D1FFFFFF" Offset="1"/> 
           </LinearGradientBrush> 
          </Rectangle.Fill> 
         </Rectangle> 
         <Grid> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition/> 
           <ColumnDefinition Width="1"/> 
           <ColumnDefinition/> 
          </Grid.ColumnDefinitions> 
          <Grid.RowDefinitions> 
           <RowDefinition/> 
           <RowDefinition/> 
           <RowDefinition/> 
          </Grid.RowDefinitions> 
          <TextBlock Grid.Row="0" Grid.ColumnSpan="3" Text="Headers" TextAlignment="Center"/> 
          <Rectangle Grid.Row="1" Grid.ColumnSpan="3" Fill="{TemplateBinding SeparatorBrush}" Height="1"/> 
          <TextBlock Grid.Row="2" Grid.Column="0" Text="Header 1" TextAlignment="Center"/> 
          <Rectangle Grid.Row="2" Grid.Column="1" Fill="{TemplateBinding SeparatorBrush}" Width="1"/> 
          <TextBlock Grid.Row="2" Grid.Column="2" Text="Header 2" TextAlignment="Center"/> 
          <Path x:Name="SortIcon" Grid.Column="2" Fill="#FF444444" Stretch="Uniform" HorizontalAlignment="Left" Margin="4,0,0,0" VerticalAlignment="Center" Width="8" Opacity="0" RenderTransformOrigin=".5,.5" Data="F1 M -5.215,6.099L 5.215,6.099L 0,0L -5.215,6.099 Z "/> 
         </Grid> 
         <Rectangle x:Name="VerticalSeparator" Fill="{TemplateBinding SeparatorBrush}" VerticalAlignment="Stretch" Width="1" Visibility="{TemplateBinding SeparatorVisibility}" Grid.Column="1"/> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</UserControl.Resources> 
<data:DataGrid x:Name="LayoutRoot"> 
    <data:DataGrid.Columns> 
     <data:DataGridTemplateColumn HeaderStyle="{StaticResource SplitColumnHeaderStyle}"> 
      <data:DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition/> 
          <ColumnDefinition/> 
         </Grid.ColumnDefinitions> 
         <Border Grid.Column="0" BorderBrush="#FFC9CACA" BorderThickness="0,0,0,0"> 
          <TextBlock Grid.Column="0" Text="{Binding GridData.Column1}"/> 
         </Border> 
         <Border Grid.Column="1" BorderBrush="#FFC9CACA" BorderThickness="1,0,0,0"> 
          <TextBlock Grid.Column="0" Text="{Binding GridData.Column2}"/> 
         </Border> 
        </Grid> 
       </DataTemplate> 
      </data:DataGridTemplateColumn.CellTemplate> 
     </data:DataGridTemplateColumn> 
    </data:DataGrid.Columns> 
</data:DataGrid> 

Ahora quiero volver a utilizar & extender este estilo para apoyar 2-> 6 cabeceras sub-columna, pero no sé si hay una manera de hacer esto , Como ContentPresenter "anulando":

<Style x:Key="SplitColumnHeaderStyle" TargetType="primitives:DataGridColumnHeader"> 
    <Setter property="Template"> 
     <Setter.Value> 
      ... 
      <ContentPresenter Content="{TemplateBinding Content}".../> 
      ... 
     </Setter.Value> 
    </Setter> 
</Style> 

<Style x:Key="TwoSubColumnHeaderStyle" BasedOn="SplitColumnHeaderStyle"> 
    <Setter property="Content"> 
     <Setter.Value> 
      <Grid 2x2.../> 
     </Setter.Value> 
    </Setter> 
</Style> 

<Style x:Key="ThreeSubColumnHeaderStyle" BasedOn="SplitColumnHeaderStyle"> 
    <Setter property="Content"> 
     <Setter.Value> 
      <Grid 2x3.../> 
     </Setter.Value> 
    </Setter> 
</Style> 

De todos modos, por favor me ayude en estos temas:

  1. Dadas las plantillas anteriores, cómo apoyar más cabeceras sub-columnas sin tener que crear una nueva plantilla para ¿cada?

  2. Suponiendo que se resuelve el problema anterior. ¿Cómo podría adjuntar nombres de columna fuera de los estilos?

  3. veo que algunas partes, propiedades & reglas de visualización en el XAML son sólo copias de estilo del componente Silverlight original, es decir BackgroundGradient, BackgroundRectangle, VisualStateManager ... Tienen que estar allí con el fin de apoyar defecto comportamientos o efectos pero ... ¿alguien sabe cómo eliminarlos, pero conserva todos los comportamientos/efectos predeterminados?

Sé específico porque estoy empezando con C# & Silverlight.

Respuesta

0
+1

Gracias por su respuesta, pero he mencionado en mi post que yo era capaz de crear ese tipo de rejilla. Lo que realmente no sé hacer a continuación es personalizar esa plantilla para reutilizarla para cualquier cantidad de subcolumnas. Terminé copiando, modificando y pegando la plantilla para resolver esto y fue una tarea tediosa :( – instcode

+2

@Jasper: en lugar de solo proporcionar el enlace, si puede proporcionar una respuesta más detallada sería genial y mejorará la calidad de su respuesta. Intente citar cosas del enlace que mencionó. –

Cuestiones relacionadas