如何使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>
在一个新行上产生的可选区域在图像中显示为小的蓝色区域。这是用户击中的非常小的目标,并且这恰好是他们希望在新行上开始的最可能的列。
如果我删除CellStyle,该区域按要求工作,但当然我失去了正确的路线。
有谁知道如何实现这两个?
我试过的东西
- 将绑定的TargetNullValue设置为具有某种宽度的格式。 这对现有的行起作用,但对新行没有影响。
- 在列上设置MinWidth,这不会影响新行可选区域的宽度。
事情有效:
使用来自@AngelWPF答案的信息,我能够从使用CellStyle更改为使用ElementStyle,如下所示:
<DataGridTextColumn Binding="{Binding Path=ImpaId}" CellStyle="{StaticResource CellRightAlign}">
成为
<DataGridTextColumn Binding="{Binding Path=ImpaId}" ElementStyle="{StaticResource CellRightAlign}">
你可以应用ElementStyle
在DataGridTextColumn
到TextBlock
并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。
来自原始样式的已更改项目是样式本身中的VerticalAlignment
和VerticalContentAlignment
的设置器,以在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>