如何让 WPF DataGrid 单元格右对齐而不使新行上的可选区域变小?

Posted

技术标签:

【中文标题】如何让 WPF DataGrid 单元格右对齐而不使新行上的可选区域变小?【英文标题】:How to get a WPF DataGrid cell to right align without making the selectable area on a new row tiny? 【发布时间】:2011-12-09 15:58:00 【问题描述】:

我正在使用 WPF4.0 数据网格。当双击新行中的单元格时,一切正常除非我已向该列添加了单元格样式。例如,我有一个数字列,我希望数据右对齐,因此 xaml 看起来像这样

<DataGridTextColumn Binding="Binding Path=ImpaId"
                    CellStyle="StaticResource CellRightAlign">
     <DataGridTextColumn.Header>
          <TextBlock  Style="StaticResource DataGridHeader">Impa</TextBlock>
     </DataGridTextColumn.Header>
</DataGridTextColumn>

共享资源中的样式只是:

<Style x:Key="CellRightAlign">
    <Setter Property="Control.HorizontalAlignment"
            Value="Right" />
</Style>

新行上生成的可选区域在图像中显示为那个蓝色的小区域。这是一个非常小的目标,用户可以点击,而这恰好是他们最可能想要开始的列新行。

如果我删除 CellStyle,该区域将按需要工作,但我当然会失去正确的对齐方式。

有谁知道如何实现这两者?

我尝试过的事情

    将绑定上的 TargetNullValue 设置为具有一定宽度的格式。 这适用于现有行,但对新行没有影响。 在列上设置 MinWidth,这不会影响可选择的新行的宽度 地区。

有效的方法:

使用@AngelWPF 的答案中的信息,我能够从使用 CellStyle 更改为使用 ElementStyle,如下所示:

<DataGridTextColumn Binding="Binding Path=ImpaId"
                    CellStyle="StaticResource CellRightAlign">

成为

<DataGridTextColumn Binding="Binding Path=ImpaId"
                    ElementStyle="StaticResource CellRightAlign">

【问题讨论】:

类似问题但不知道答案:***.com/questions/18378515/… 【参考方案1】:

我遇到了同样的问题,现在解决了。如果你想在c#代码里面做,你需要设置一堆setter:

DataGridTextColumn numColumn = new DataGridTextColumn
Style s = new Style();
s.Setters.Add(new Setter(HorizontalAlignmentProperty, HorizontalAlignment.Stretch));
s.Setters.Add(new Setter(HorizontalContentAlignmentProperty, HorizontalAlignment.Right));
s.Setters.Add(new Setter(TextBlock.HorizontalAlignmentProperty, HorizontalAlignment.Stretch));
s.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));
numColumn.CellStyle = s;

【讨论】:

【参考方案2】:

只是想为将来的代码搜索添加更多示例。

我把它放在 xaml 文件的顶部:

<UserControl.Resources>
    <Style TargetType="x:Type TextBlock" x:Key="RightCell">
        <Setter Property="Background" Value="Binding Included, Converter=StaticResource BoolToColorConverter"/>
        <Setter Property="HorizontalAlignment" Value="Stretch"/>
        <Setter Property="TextAlignment" Value="Right"/>
    </Style>
</UserControl.Resources>

然后在数据网格中:

<DataGridTextColumn Header="Excluded" Binding="Binding Excluded" ElementStyle="StaticResource RightCell"/>

这个右对齐文本并且排序仍然启用。文本框填充单元格,在这种情况下使用布尔转换器着色。

【讨论】:

完美而简单的“ElementStyle”赋值。【参考方案3】:

我刚刚遇到了类似的问题,并通过覆盖 Blend 中 DataGridCell 的样式找到了另一个解决方案。

从原始样式更改的项目是样式本身中的VerticalAlignmentVerticalContentAlignment 的设置器以拉伸单元格本身,以及模板属性中的VerticalAlignment="Center"HorizontalAlignment="Right" 以对齐内容。将这些值更改为对齐单元格内容所需的任何值。

样式的其余部分可以删除,以便使用基本样式中的设置(使用 StaticResource,样式为 BasedOn)。但是我留下了 Blend 制作的风格。

这个生成的 XAML 代码应该包含在控件资源中:

<Style TargetType="x:Type DataGridCell" BasedOn="StaticResource ResourceKey=x:Type DataGridCell">
    <Setter Property="VerticalAlignment" Value="Stretch" />
    <Setter Property="VerticalContentAlignment" Value="Stretch" />

    <!-- Additional styles, can be removed to fall back to base styles -->
    <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
                        ContentTemplate="TemplateBinding ContentTemplate"
                        Content="TemplateBinding Content"
                        ContentStringFormat="TemplateBinding ContentStringFormat"
                        SnapsToDevicePixels="TemplateBinding SnapsToDevicePixels"
                        VerticalAlignment="Center"
                        HorizontalAlignment="Right"
                        />
                </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 ComponentResourceKey ResourceId=FocusBorderBrushKey, TypeInTargetAssembly=x:Type DataGrid"/>
        </Trigger>
    </Style.Triggers>
</Style>

【讨论】:

【参考方案4】:

您可以在DataGridTextColumn 上应用ElementStyleTextBlock 为目标并右对齐,它会起作用。

      <DataGridTextColumn Binding="Binding Path=ImpaId">
          <DataGridTextColumn.Header>
               <TextBlock  Style="StaticResource
                                  DataGridHeader">
                    Impa
               </TextBlock>
          </DataGridTextColumn.Header>
          <DataGridTextColumn.ElementStyle>
              <Style TargetType="x:Type TextBlock">
                  <Setter Property="HorizontalAlignment" Value="Right" />
              </Style>
          </DataGridTextColumn.ElementStyle>
      </DataGridTextColumn> 

【讨论】:

我能够通过在外部 DataGridTextColumn 添加 ElementStyle 属性并让它使用我现有的 CellRightAlign 来最小化代码。谢谢。【参考方案5】:

您可以尝试解决方法:

           <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Grid Background="White" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                        <TextBlock HorizontalAlignment="Right" Text="Binding Path=ImpaId"/>
                    </Grid>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

【讨论】:

以上是关于如何让 WPF DataGrid 单元格右对齐而不使新行上的可选区域变小?的主要内容,如果未能解决你的问题,请参考以下文章

wpf datagrid 单元格如何默认单击一次点中

C#WPF根据数据长度编辑datagrid单元格颜色

无法编辑我的 DataGrid WPF Framework 4.5 的单元格

DataGrid 中的文本对齐方式

c# wpf datagrid 模板列修改某个单元格,更新所选行另一个单元格的值,如何做到呢?

WPF DataGrid:如何在单击单元格时停止自动滚动?