2011-12-21 14 views
13

Quiero editar el estilo de celda de DataGrid en WPF. Así que usando Expression Blend que ir a la derecha - Objetos y escala de tiempo >> >> DataGrid editar plantillas adicionales >> Editar CellStyle >> Editar una copia
Esto es lo que aparece en la página:Forma correcta de reemplazar valores de estilo en WPF

<SolidColorBrush x:Key="{x:Static DataGrid.FocusBorderBrushKey}" Color="#FF000000"/> 
<Style x:Key="DataGridCellStyle1" TargetType="{x:Type DataGridCell}"> 
    <Setter Property="Background" Value="Transparent"/> 
    <Setter Property="BorderBrush" Value="Transparent"/> 
    <Setter Property="BorderThickness" Value="1"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type DataGridCell}"> 
       <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True"> 
        <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="IsSelected" Value="True"> 
      <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/> 
      <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/> 
      <Setter Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/> 
     </Trigger> 
     <Trigger Property="IsKeyboardFocusWithin" Value="True"> 
      <Setter Property="BorderBrush" Value="{DynamicResource {x:Static DataGrid.FocusBorderBrushKey}}"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

Pero sólo quieren para cambiar el relleno y el fondo. En cambio, me ha dado 25 líneas de código, ¡incluida la plantilla de la celda! ¿Me estoy perdiendo algo, hay una mejor manera de diseñar elementos como este sin tener que traer tanto código extra innecesario cuando solo quiero cambiar dos elementos?

Respuesta

30

Mira la "BasedOn" atributo de estilos ...

Por ejemplo el siguiente estilo lleva todo, desde DataGridColumnHeader y sólo anula el HorizontalContentAlignment propiedad:

<Style x:Key="CenterAlignedColumnHeaderStyle" TargetType="{x:Type DataGridColumnHeader}" 
     BasedOn="{StaticResource {x:Type DataGridColumnHeader}}"> 
    <Setter Property="HorizontalContentAlignment" Value="Center"/> 
</Style> 
+1

característica impresionante. Me ayudó a usar plugins dlls sin que estropeara mi estilo, ahorrándome un montón de trabajo. ¡Gracias! –

2

La anulación de las plantillas de control en WPF requiere que se reemplace completamente la plantilla. Es posible que haya deseado cambiar solo un aspecto de la plantilla, pero el resultado es Expresión volcando una copia del resto de la plantilla para que se pueda anular. Asegúrate de anular la celda de la manera adecuada (no estoy seguro de que haya otra forma). Me vienen a la mente algunos controles (ListView) que le permitirán cambiar las plantillas de datos sin anular toda la plantilla de control, pero no estoy seguro de que eso sea lo que desea o si puede hacerlo con DataGrid.

Ver la respuesta a esta: Replace part of default template in WPF

2

para hacer lo que quiere hacer, que generalmente se acaba de establecer las propiedades de fondo y relleno en un estilo:

<Style TargetType="DataGridCell"> 
    <Setter Property="Padding" Value="10" /> 
    <Setter Property="Background" Value="Green" /> 
</Style> 

Sin embargo, en este caso parece que la plantilla de control predeterminada para DataGridCell ignora el valor de relleno, por lo que deberá reemplazarlo con una implementación que no lo haga. Lo siguiente se basa en la plantilla por defecto que usted envió:

<Style TargetType="DataGridCell"> 
    <Setter Property="Padding" Value="10" /> 
    <Setter Property="Background" Value="Green" /> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type DataGridCell}"> 
      <Border BorderBrush="{TemplateBinding BorderBrush}" 
        BorderThickness="{TemplateBinding BorderThickness}" 
        Background="{TemplateBinding Background}" 
        SnapsToDevicePixels="True"> 
       <ContentPresenter 
        Margin="{TemplateBinding Padding}" <!-- this bit does the padding --> 
        SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
      </Border> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 
Cuestiones relacionadas