2011-12-21 19 views
13

WPFでDataGridのセルスタイルを編集したいとします。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> 

しかし、私はしたい:ここでは何がページに表示されるものだが、編集CellStyle >>コピー
を編集>>追加のテンプレートを編集>>オブジェクトとタイムライン>> DataGridの - だから私は右に行くExpression Blendのを使用してパディングと背景を変更します。代わりに、それは私に細胞テンプレートを含む25行のコードを与えました!何かが欠けていますか?2つのアイテムだけを変更したいときに余分な不要なコードを持たなくても、このようなアイテムをスタイリングするより良い方法がありますか?

答えて

30

スタイルのための「BASEDON」属性をチェックアウト...

たとえば次のスタイルは、DataGridColumnHeaderからすべてを取り、のみ

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

素晴らしい機能:Horizo​​ntalContentAlignmentプロパティをオーバーライドします。プラグインDLLを使用して私のスタイルを台無しにすることなく、多大な労力を節約できました。ありがとう! –

2

WPFのコントロールテンプレートをオーバーライドするには、テンプレートを完全に置き換える必要があります。テンプレートの1つの側面だけを変更したがっている可能性がありますが、それがオーバーライドできるように残りのテンプレートのコピーをダンプするExpressionです。適切な方法でセルを上書きしていることを確認してください(別の方法があるかどうかはわかりません)。いくつかのコントロール(ListViewが気になる)は、コントロールテンプレート全体をオーバーライドせずにデータテンプレートを交換することができますが、それはあなたが望むものであるかどうか、またはDataGridで行うことができるかどうかはわかりません。

はこれに答えを参照してください: Replace part of default template in WPF

2

はあなたが何をしたいのか行うには、通常はスタイルで背景とパディングのプロパティを設定します:

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

は、しかし、この場合、それはそう

DataGridCellのデフォルトのコントロールテンプレートはパディング値を無視するため、そうでない実装に置き換える必要があります。次はあなたが投稿デフォルトのテンプレートに基づいています。

<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> 
関連する問題