如何使WPF DataGrid单元格右alignment,而不使新行上的可选区域变得很小?

我正在使用WPF4.0 DataGrid。 当双击一个新行中的单元格时,一切正常, 除非我向该列添加了单元格样式。 例如,我有一个数字列,我希望数据右alignment,所以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> 

在一个新行上产生的可选区域在图像中显示为小的蓝色区域。这是用户击中的非常小的目标,并且这恰好是他们希望在新行上开始的最可能的列。

DataGrid单元格的宽度很小

如果我删除CellStyle,该区域按要求工作,但当然我失去了正确的路线。

DataGrid单元格具有适当的宽度

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

我试过的东西

  1. 将绑定的TargetNullValue设置为具有某种宽度的格式。 这对现有的行起作用,但对新行没有影响。
  2. 在列上设置MinWidth,这不会影响新行可选区域的宽度。

事情有效:

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

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

成为

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

你可以应用ElementStyleDataGridTextColumnTextBlock并alignment,它将工作。

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

只是想为未来的代码search添加更多的例子。

我把它放在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> 

然后在datagrid中:

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

这右alignment文本和sorting仍然启用。 文本框填充单元格,在这种情况下使用bool转换器着色。

你可以尝试一下工作:

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

我只是有一个类似的问题,并通过覆盖Blend中的DataGridCell的样式发现另一个解决scheme。

来自原始样式的已更改项目是样式本身中的VerticalAlignmentVerticalContentAlignment的设置器,以在Template属性中拉伸单元格本身和VerticalAlignment="Center"HorizontalAlignment="Right"以alignment内容。 将这些值更改为任何您需要alignment单元格内容。

样式的其余部分可以被删除,以便使用基本样式的设置(使用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>