Установка заполнения для dataGridCells в WPF

простой вопрос: Как я могу установить заполнение на dataGridCell в WPF? (либо по одному, либо по всем клеткам, мне все равно)

Я пробовал использовать DataGrid.CellStyle свойство путем добавления сеттера на DataGridCell.Padding свойство, а также использование DataGridColumn.CellStyle свойство таким же образом без эффекта.

Я также попытался с помощью DataGridColumn.ElementStyle собственность больше не повезло.

Я вроде застрял там, кто-нибудь сумел получить прокладку, примененную на dataGridCell?

NB: я добавлю, что нет, я не могу использовать прозрачные границы для этого, так как я уже использую свойства границы для чего-то другого. Я также не могу использовать свойство margin (которое, как ни странно, работает), поскольку я использую свойство background, и я не хочу никакого "пустого" пространства между моими ячейками.

5 ответов


проблема в том, что Padding не переданы Border это в шаблоне DataGridCell. Вы можете отредактировать шаблон и добавить TemplateBinding для Padding

<DataGrid ...>
    <DataGrid.CellStyle>
        <Style TargetType="DataGridCell">
            <Setter Property="Padding" Value="20"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type DataGridCell}">
                        <Border Padding="{TemplateBinding Padding}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                            <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </DataGrid.CellStyle>
    <!--...-->
</DataGrid>

вот более чистый метод (мое мнение), который сочетает в себе подход от Дэвида

<Resources>
    <Style x:Key="ColumnElementStyle" TargetType="TextBlock">
        <Setter Property="Margin" Value="5,0,10,0" />
    </Style>
</Resources>

затем...

<DataGridTextColumn ElementStyle="{StaticResource ColumnElementStyle}" />
<DataGridTextColumn ElementStyle="{StaticResource ColumnElementStyle}" />

(в моем случае мои строки только для чтения, поэтому нет EditingStyle)


почти 5 лет спустя, поскольку этот вопрос, похоже, все еще используется (он все еще получает upvotes), и поскольку он был запрошен, вот решение, которое я использовал (с ElementStyle) на TextColumn (но вы можете сделать то же самое для любого типа DataGridColumn):

Я сделал все это в коде позади:

class MyTextColumn : DataGridTextColumn
{
    public MyTextColumn()
    {
        ElementStyle = new Style(typeof(TextBlock));
        EditingElementStyle = new Style(typeof(TextBox));

        ElementStyle.Setters.Add(new Setter(FrameworkElement.MarginProperty, new Thickness(3)));
        EditingElementStyle.Setters.Add(new Setter(Control.PaddingProperty, new Thickness(0, 1, 0, 1)));
    }
}

но если вы хотите сделать это непосредственно в xaml:

<DataGrid.Columns>
    <DataGridTextColumn>
        <DataGridTextColumn.ElementStyle>
            <Style TargetType="TextBlock">
                <Setter Property="Margin" Value="3"/>
            </Style>
        </DataGridTextColumn.ElementStyle>
        <DataGridTextColumn.EditingElementStyle>
            <Style TargetType="TextBox">
                <Setter Property="Padding" Value="0 1 0 1"/>
            </Style>
        </DataGridTextColumn.EditingElementStyle>
    </DataGridTextColumn>
</DataGrid.Columns>

<DataGrid.Columns>
      <DataGridTextColumn  MinWidth="100" Header="Changed by"  Width=""  Binding="{Binding Changedby}" IsReadOnly="True"  >
        <DataGridTextColumn.CellStyle>
          <Style TargetType="DataGridCell">
          <Setter Property="BorderThickness" Value="0"/>
          <Setter Property="Background" Value="Transparent" />
         <Setter Property="FrameworkElement.HorizontalAlignment"Value="Center"/>
          </Style>
      </DataGridTextColumn.CellStyle>
    </DataGridTextColumn>


вы также можете попробовать изменить

{Binding BindingValue, StringFormat={}{0:#0.0000}}

to

{Binding BindingValue, StringFormat={}{0:#0.0000 }}

достаточно интересно, что XAML WPF {0:#0.0000 } будет использовать этот дополнительный символ пробела в формате отображаемого элемента управления для перемещения значений с края столбцов сетки.