J'utilise un DataGrid WPF4.0. Lorsque vous double-cliquez sur une cellule d'une nouvelle ligne, tout fonctionne correctement sauf J'ai ajouté un style de cellule à cette colonne. Par exemple, j'ai une colonne numérique où je veux que les données soient alignées à droite pour que le xaml ressemble à ceci
<DataGridTextColumn Binding="{Binding Path=ImpaId}"
CellStyle="{StaticResource CellRightAlign}">
<DataGridTextColumn.Header>
<TextBlock Style="{StaticResource DataGridHeader}">Impa</TextBlock>
</DataGridTextColumn.Header>
</DataGridTextColumn>
Où le style dans une ressource partagée est juste:
<Style x:Key="CellRightAlign">
<Setter Property="Control.HorizontalAlignment"
Value="Right" />
</Style>
La zone sélectionnable résultante sur une nouvelle ligne est représentée dans l'image comme cette petite zone bleue. Il s'agit d'une très petite cible que l'utilisateur doit atteindre, et il se trouve que c'est la colonne la plus probable avec laquelle il voudra commencer sur une nouvelle ligne. .
Si je supprime le CellStyle, la zone fonctionne comme souhaité, mais bien sûr, je perds le bon alignement.
Quelqu'un sait-il comment atteindre les deux?
Choses que j'ai essayées
Chose qui a fonctionné:
En utilisant les informations de la réponse de @AngelWPF, j'ai pu passer de CellStyle à ElementStyle comme suit:
<DataGridTextColumn Binding="{Binding Path=ImpaId}"
CellStyle="{StaticResource CellRightAlign}">
Est devenu
<DataGridTextColumn Binding="{Binding Path=ImpaId}"
ElementStyle="{StaticResource CellRightAlign}">
Vous pouvez appliquer ElementStyle
sur le DataGridTextColumn
ciblé sur TextBlock
et l'aligner à droite, cela fonctionnerait.
<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>
Je voulais juste ajouter plus d'exemples pour de futures recherches de code.
Je mets ceci en haut du fichier 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>
Et puis dans la grille de données:
<DataGridTextColumn Header="Excluded" Binding="{Binding Excluded}" ElementStyle="{StaticResource RightCell}"/>
Ce droit aligne le texte et le tri est toujours activé. La zone de texte remplit la cellule et dans ce cas est colorée à l'aide d'un convertisseur booléen.
J'ai juste eu un problème similaire et j'ai trouvé une autre solution en écrasant le style de DataGridCell dans Blend.
Les éléments modifiés du style d'origine sont les paramètres de VerticalAlignment
et VerticalContentAlignment
dans le style lui-même pour étirer la cellule elle-même et VerticalAlignment="Center"
et HorizontalAlignment="Right"
dans la propriété Template pour aligner le contenu. Remplacez ces valeurs par tout ce dont vous avez besoin pour aligner le contenu des cellules.
Le reste du style pourrait être supprimé afin que les paramètres du style de base soient utilisés (en utilisant StaticResource, le style est BasedOn). Cependant, j'ai laissé le style tel que Blend l'a produit.
Ce code XAML résultant doit ensuite être inclus dans les ressources de contrôle:
<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>
Vous pouvez essayer une solution de contournement:
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid Background="White" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<TextBlock HorizontalAlignment="Right" Text="{Binding Path=ImpaId}"/>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>