web-dev-qa-db-ja.com

WPFのdataGridCellsにパディングを設定します

簡単な質問:WPFでdataGridCellにパディングを設定するにはどうすればよいですか? (一度に1つまたはすべてのセルで、気にしません)

DataGrid.CellStyleプロパティにセッターを追加してDataGridCell.Paddingプロパティを使用し、同様にDataGridColumn.CellStyleプロパティを使用しても効果はありません。

また、DataGridColumn.ElementStyleプロパティを使用してみましたが、これ以上運はありません。

私はそこに行き詰まっている、誰かがdataGridCellにパディングを適用することができたのか?

注:いいえ、追加します。透明な境界線を使用してこれを行うことはできません。境界線プロパティを他の何かに既に使用しているからです。 backgroundプロパティを使用し、セル間に「空白」スペースが必要ないため、marginプロパティも使用できません(驚くほど十分に機能しているようです)。

56
David

問題は、PaddingBorderのテンプレートにあるDataGridCellに転送されないことです。テンプレートを編集し、PaddingのTemplateBindingを追加できます

<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>
113
Fredrik Hedblad

Davidのアプローチを組み合わせた、よりクリーンな方法(私の意見)です。

<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はありません)

19
Scott Brickey

ほぼ5年後、この質問はまだ使用されているようだ(まだ賛成票を受け取っている)ので、要求されているので、ここでTextColumnで(ElementStyleを使用して)使用したソリューションを示します(ただし、任意のタイプの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>
8
David
<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>
1
Raj

また、変更してみることができます

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

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

興味深いことに、WPFのXAML {0:#0.0000}は、レンダリングされたコントロールの形式でこの余分なスペース文字を尊重し、グリッド列のエッジから値を移動します。

0
Jacob