2011-12-21 11 views
13

Chcę edytować styl komórki z DataGrid w WPF. Więc za pomocą Expression Blend mam prawo przejść do - obiektów i Timeline >> DataGrid >> edytować dodatkowe szablony >> Edycja CellStyle >> Edycja Kopiuj
Oto co co pojawi się na stronie:Właściwy sposób na przesłonięcie wartości stylu w 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> 

Ale chcę tylko aby zmienić dopełnienie i tło. Zamiast tego dał mi 25 linii kodu, w tym szablon komórki! Czy brakuje mi czegoś, czy istnieje lepszy sposób stylizowania przedmiotów takich jak ten bez konieczności dostarczania tak bardzo niepotrzebnego kodu, gdy chcę tylko zmienić dwa przedmioty?

Odpowiedz

30

Sprawdź „basedon” atrybut style ...

Na przykład następujący styl bierze wszystko z DataGridColumnHeader a jedynie dokumentacja jest oparty na domyślnym szablonie, który pisał po nadpisuje HorizontalContentAlignment właściwość:

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

Niesamowite funkcję. Pomógł mi używać wtyczek DLL bez bałaganu w moim stylu, oszczędzając mi mnóstwo pracy. Dzięki! –

2

Nadpisywanie szablonów kontrolek w WPF wymaga całkowitego zastąpienia szablonu. Możliwe, że chciałeś zmienić tylko jeden aspekt szablonu, ale wynikiem tego jest Wyrażanie, wyrzucając kopię reszty szablonu, aby można go było przesłonić. Upewnij się, że celowo zmieniasz komórkę (nie jestem pewien, czy jest inny sposób). Niektóre kontrolki (ListView przychodzi na myśl) pozwalają wymieniać szablony danych bez przesłonięcia całego szablonu kontrolnego, ale nie jestem pewien, czy tego chcesz lub czy można to zrobić za pomocą DataGrid.

Patrz odpowiedź na to: Replace part of default template in WPF

2

Aby zrobić to, co chcesz zrobić, to zwykle wystarczy ustawić właściwości tła i wyściółka w stylu:

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

Jednak w tym przypadku wydaje się, domyślny szablon kontrolny dla obiektu DataGridCell ignoruje wartość dopełnienia, dlatego należy go zastąpić implementacją, która tego nie robi.

<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> 
Powiązane problemy