Tod*_*Tod 58 wpf xaml datagrid
我正在使用WPF4.0 DataGrid.当双击新行中的单元格时,除非我已向该列添加单元格样式,否则一切正常.例如,我有一个数字列,我希望数据右对齐,所以xaml看起来像这样
<DataGridTextColumn Binding="{Binding Path=ImpaId}"
CellStyle="{StaticResource CellRightAlign}">
<DataGridTextColumn.Header>
<TextBlock Style="{StaticResource DataGridHeader}">Impa</TextBlock>
</DataGridTextColumn.Header>
</DataGridTextColumn>
Run Code Online (Sandbox Code Playgroud)
共享资源中的样式只是:
<Style x:Key="CellRightAlign">
<Setter Property="Control.HorizontalAlignment"
Value="Right" />
</Style>
Run Code Online (Sandbox Code Playgroud)
新行上的最终可选区域在图像中显示为小蓝色区域.这是用户点击的非常小的目标,这恰好是他们想要在新行上开始的最可能的列.

如果我删除CellStyle,该区域按预期工作,但当然我失去了正确的对齐方式.

有谁知道如何实现这两个目标?
我试过的事情
有用的东西:
使用@AngelWPF答案中的信息,我可以使用CellStyle更改为使用ElementStyle,如下所示:
<DataGridTextColumn Binding="{Binding Path=ImpaId}"
CellStyle="{StaticResource CellRightAlign}">
Run Code Online (Sandbox Code Playgroud)
成为
<DataGridTextColumn Binding="{Binding Path=ImpaId}"
ElementStyle="{StaticResource CellRightAlign}">
Run Code Online (Sandbox Code Playgroud)
WPF*_*-it 84
您可以应用ElementStyle在DataGridTextColumn针对性的对TextBlock和右对齐的是,它会工作.
<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>
Run Code Online (Sandbox Code Playgroud)
小智 16
只是想为将来的代码搜索添加更多示例.
我把它放在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>
Run Code Online (Sandbox Code Playgroud)
然后在datagrid中:
<DataGridTextColumn Header="Excluded" Binding="{Binding Excluded}" ElementStyle="{StaticResource RightCell}"/>
Run Code Online (Sandbox Code Playgroud)
此右对齐文本,仍然启用排序.文本框填充单元格,在这种情况下使用bool转换器着色.
你可以尝试一下解决方法:
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid Background="White" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<TextBlock HorizontalAlignment="Right" Text="{Binding Path=ImpaId}"/>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Run Code Online (Sandbox Code Playgroud)
我只是遇到了类似的问题,并通过在Blend中覆盖DataGridCell的样式找到了另一种解决方案.
更改的项目从原来的风格是setter方法VerticalAlignment,并VerticalContentAlignment在样式本身伸展细胞本身VerticalAlignment="Center"并HorizontalAlignment="Right"在模板属性来对齐内容.将这些值更改为对齐单元格内容所需的任何值.
风格的其余部分可以被去除,从而从基本样式的设置将用于(使用StaticResource的风格是支持算法FMP).然而,当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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
57833 次 |
| 最近记录: |