61 votes

Comment obtenir une cellule WPF DataGrid aligner à droite sans rendre la zone de sélection d'une nouvelle ligne infime?

Je suis à l'aide d'un WPF4.0 DataGrid. En double-cliquant sur une cellule dans une nouvelle ligne tout fonctionne bien sauf que j'ai ajouté un style de cellule de cette colonne. Par exemple, j'ai une colonne numérique où je veux les données aligné à droite de sorte 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>

Le résultant zone sélectionnable sur une nouvelle ligne est montré dans l'image en tant que petite zone bleue.C'est une très petite cible pour l'utilisateur de frapper, et ce qui se passe pour être la plus probable de la colonne, ils voudront faire pour 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 l'alignement à droite.

DataGrid cell with proper width

Personne ne sait comment les atteindre?

Choses que j'ai essayé

  1. Réglage 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. Réglage MinWidth sur la colonne, cela n'a pas d'incidence sur la largeur de la nouvelle ligne sélectionnable la zone.

Chose qui a fonctionné:

En utilisant l'information de la réponse par @AngelWPF j'ai été capable de passer de l'utilisation d'CellStyle à l'aide de ElementStyle comme suit:

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

Est devenu

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

87voto

WPF-it Points 10977

Vous pouvez appliquer ElementStyle sur les DataGridTextColumn ciblés sur TextBlock et aligner cela correctement, 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> 
 

5voto

MichaelS Points 2560

Vous pouvez essayer un travail autour:

            <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Grid Background="White" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                        <TextBlock HorizontalAlignment="Right" Text="{Binding Path=ImpaId}"/>
                    </Grid>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
 

5voto

mattanja Points 664

J'ai juste eu un problème similaire et trouvé une autre solution en écrasant le Style de la DataGridCell dans le Mélange.

Les éléments modifiés du style d'origine sont les setters pour VerticalAlignment et VerticalContentAlignment dans le même Style à l'étirement de la cellule elle-même et VerticalAlignment="Center" et HorizontalAlignment="Right" dans la propriété de Modèle pour aligner le contenu. Modifier ces valeurs à tout ce que vous devez aligner le contenu des cellules.

Le reste, le style pourrait être supprimée de sorte que les paramètres de la base de style sera utilisé (à l'aide de la StaticResource, le style est Basée). Cependant, j'ai quitté le style de Mélange de produit.

Ce code XAML résultant de Code devrait être inclus dans le contrôle des ressources:

<Style TargetType="{x:Type DataGridCell}" BasedOn="{StaticResource ResourceKey={x:Type DataGridCell}}">
    <Setter Property="VerticalAlignment" Value="Stretch" />
    <Setter Property="VerticalContentAlignment" Value="Stretch" />

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X