Установите дополнение в dataGridCells в WPF
простой вопрос: как я могу установить дополнение в dataGridCell в WPF?
(по одному за раз или по всем ячейкам, мне все равно)
Я попытался использовать свойство DataGrid.CellStyle
, добавив сеттер в свойство DataGridCell.Padding
, а также используя свойство DataGridColumn.CellStyle
таким же образом без эффекта.
Я также попытался использовать свойство DataGridColumn.ElementStyle
, не имея больше удачи.
Я как бы застрял там, кому-нибудь удалось получить дополнение, примененное к dataGridCell?
NB: Я добавлю, что нет, я не могу использовать прозрачные границы для этого, так как я уже использую свойства границ для чего-то другого. Я также не могу использовать свойство margin (которое, кажется, работает, как ни странно), поскольку я использую свойство background, и я не хочу "пустое" пространство между моими ячейками.
Ответы
Ответ 1
Проблема заключается в том, что 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>
Ответ 2
Здесь более чистый метод (мое мнение), который сочетает в себе подход от Дэвида
<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)
Ответ 3
Почти 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>
Ответ 4
Вы также можете попробовать изменить
{Binding BindingValue, StringFormat={}{0:#0.0000}}
to
{Binding BindingValue, StringFormat={}{0:#0.0000 }}
Интересно, что WPF XAML {0: # 0.0000} будет отмечать этот лишний символ пробела в формате обработанного элемента управления, чтобы переместить ваши значения с края столбцов сетки.
Ответ 5
<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>