Подтвердить что ты не робот

Правильный способ переопределения значений стиля в WPF

Я хочу изменить стиль ячейки 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 строк кода, включая шаблон ячейки! Я что-то упустил, есть ли лучший способ стилизации таких элементов, не требуя лишнего лишнего кода, когда я хочу изменить только два элемента?

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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