web-dev-qa-db-fra.com

Comment obtenir une cellule WPF DataGrid pour l'aligner à droite sans rendre la zone sélectionnable sur une nouvelle ligne minuscule?

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

DataGrid cell with tiny width

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

DataGrid cell with proper width

Quelqu'un sait-il comment atteindre les deux?

Choses que j'ai essayées

  1. Définition de 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. La définition de MinWidth sur la colonne n'a pas affecté la largeur de la nouvelle zone sélectionnable de ligne.

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}">
57
Tod

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> 
82
WPF-it

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.

14
Rahbek

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

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