2011-12-21 4 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> 

하지만 난 단지 원하는 : - 그래서 사용 Expression Blend를 내가 오른쪽으로 이동 개체 및 타임 라인 >> 데이터 그리드 >> 추가 템플릿을 편집 >> 편집 CellStyle >> 여기
무슨 일이 페이지에 표시되는 내용의 복사본을 편집 패딩과 배경을 변경합니다. 대신 그것은 세포 틀을 포함하여 25 줄의 코드를 제공합니다! 제가 누락 된 것이 있습니까? 두 항목 만 변경하려고 할 때 여분의 불필요한 코드를 가져 오지 않고도 이와 같은 항목을 스타일링하는 더 좋은 방법이 있습니까?

답변

30

체크 아웃을 : 당신이 게시 된 기본 템플릿을 기반으로 다음과 같은

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

최고 기능 다음 HorizontalContentAlignment 속성을 재정의합니다. 플러그인 스타일의 DLL을 사용하지 않고도 작업 할 수있게 도와주었습니다. 감사! –

2

WPF에서 컨트롤 템플릿을 재정의하려면 템플릿을 완전히 바꾸어야합니다. 템플릿의 한 측면 만 변경하려고했지만 나머지 템플릿의 식을 덤프하여 재정의 할 수 있습니다. 적절한 방법으로 셀을 재정의했는지 확인하십시오 (다른 방법이 있는지 확신하지 못합니다). 일부 컨트롤 (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의 기본 컨트롤 템플릿은 패딩 값을 무시하므로 필요하지 않은 구현으로 바꾸어야합니다. " BasedOn"예를 들어 다음과 같은 스타일의 모든 것을 취

스타일에 대한 속성 ...에서 DataGridColumnHeader

<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> 
관련 문제