Правильный способ переопределения значений стиля в WPF - PullRequest
15 голосов
/ 21 декабря 2011

Я хочу отредактировать стиль ячейки DataGrid в WPF. Поэтому, используя Expression Blend, я сразу перехожу к - Объекты и временная шкала >> DataGrid >> Редактировать дополнительные шаблоны >> Редактировать CellStyle >> Редактировать копию
Вот что появляется на странице:

<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>

Но я хочу изменить только отступы и фон. Вместо этого он дал мне 25 строк кода, включая шаблон ячейки! Я что-то упустил, есть ли лучший способ стилизовать подобные элементы без необходимости вносить слишком много лишнего кода, когда я хочу изменить только два элемента?

Ответы [ 3 ]

36 голосов
/ 22 декабря 2011

Проверьте атрибут " BasedOn " для стилей ...

Например, следующий стиль берет все из DataGridColumnHeader и переопределяет только HorizontalContentAlignment свойство:

<Style x:Key="CenterAlignedColumnHeaderStyle" TargetType="{x:Type DataGridColumnHeader}" 
       BasedOn="{StaticResource {x:Type DataGridColumnHeader}}">
    <Setter Property="HorizontalContentAlignment" Value="Center"/>
</Style>
3 голосов
/ 22 декабря 2011

Для переопределения шаблонов управления в WPF требуется полная замена шаблона. Возможно, вы хотели изменить только один аспект шаблона, но в результате Expression выдает копию остальной части шаблона, чтобы его можно было переопределить. Убедитесь, что вы переопределяете ячейку надлежащим образом (я не уверен, что есть другой способ). Некоторые элементы управления (на ум приходит ListView) позволят вам менять шаблоны данных, не переопределяя весь шаблон элемента управления, но я не уверен, что вы этого хотите, или это можно сделать с помощью DataGrid.

См. Ответ на этот вопрос: Заменить часть шаблона по умолчанию в WPF

2 голосов
/ 22 декабря 2011

Чтобы сделать то, что вы хотите, вы обычно просто устанавливаете фон и свойства Padding в стиле:

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...