Comment faire pour aligner une cellule de DataGrid WPF sans aligner la zone sélectionnable sur une nouvelle ligne?


Answers

Je voulais juste ajouter d'autres exemples pour les 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 le DataGrid:

<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 en utilisant un convertisseur bool.

Question

J'utilise un DataGrid WPF4.0. Lorsque vous double-cliquez sur une cellule dans une nouvelle ligne tout fonctionne correctement, sauf si 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 montrée dans l'image comme cette petite zone bleue. Il s'agit d'une très petite cible que l'utilisateur doit atteindre, et c'est la colonne la plus probable avec laquelle il veut commencer sur une nouvelle ligne .

Si je supprime le CellStyle, la zone fonctionne comme vous le souhaitez mais bien sûr, je perds le bon alignement.

Est-ce que quelqu'un sait comment réaliser les deux?

Les choses que j'ai essayées

  1. Définir TargetNullValue sur la liaison à un format avec une certaine largeur. Cela fonctionne sur les lignes existantes mais n'a aucun effet sur une nouvelle ligne.
  2. Si vous définissez MinWidth sur la colonne, cela n'affecte pas la largeur de la nouvelle zone sélectionnable.

Chose qui a fonctionné:

En utilisant les informations de la réponse de @AngelWPF, j'ai pu passer de l'utilisation de CellStyle à l'utilisation de ElementStyle comme suit:

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

Devenu

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



J'ai juste eu un problème semblable et ai trouvé une autre solution en écrasant le style pour le DataGridCell dans le mélange.

Les éléments modifiés du style d'origine sont les paramètres pour 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. Changez ces valeurs pour tout ce dont vous avez besoin pour aligner le contenu des cellules.

Le reste du style peut être supprimé afin que les paramètres du style de base soient utilisés (à l'aide de StaticResource, le style est BasedOn). Cependant j'ai laissé le style comme Blend l'a produit.

Ce code XAML résultant devrait alors être inclus dans les ressources de contrôles:

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