59 votos

¿Cómo obtener una celda de DataGrid de WPF para alinear derecha sin hacer pequeño el área seleccionable en una nueva fila?

Estoy usando un WPF4.0 DataGrid. Al hacer doble clic en una celda en una fila nueva todo funciona bien menos he añadido un estilo de celda de esa columna. Por ejemplo, tengo una columna numérica donde quiero los datos a la derecha alinea de modo que el xaml se parece a esto

<DataGridTextColumn Binding="{Binding Path=ImpaId}"
                    CellStyle="{StaticResource CellRightAlign}">
     <DataGridTextColumn.Header>
          <TextBlock  Style="{StaticResource DataGridHeader}">Impa</TextBlock>
     </DataGridTextColumn.Header>
</DataGridTextColumn>

Donde el estilo en un recurso compartido es simplemente:

<Style x:Key="CellRightAlign">
    <Setter Property="Control.HorizontalAlignment"
            Value="Right" />
</Style>

El resultado seleccionables por el área en una nueva fila se muestra en la imagen como esa pequeña zona azul.Este es un objetivo muy pequeño para el usuario pulsa, y esta pasa a ser la más probable de la columna que se quiere empezar en una nueva fila.

DataGrid cell with tiny width

Si puedo quitar el CellStyle, el área de obras como desee, pero por supuesto voy a perder la alineación a la derecha.

DataGrid cell with proper width

¿Alguien sabe cómo lograr ambos?

Cosas que he probado

  1. Configuración de TargetNullValue en la unión a un formato con algunos de ancho. Esto funciona en las filas existentes, pero no tiene efecto en una nueva fila.
  2. Configuración de MinWidth en la columna, esto no afecta a la anchura de la nueva fila seleccionable área.

Cosa que trabajó:

Utilizando la información de la respuesta por @AngelWPF yo era capaz de cambiar el uso de CellStyle para el uso de ElementStyle de la siguiente manera:

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

Se convirtió en

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

85voto

WPF-it Puntos 10977

Se podría aplicar ElementStyle en la DataGridTextColumn dirigido a TextBlock y derecha alinear que funcionaría.

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

6voto

mattanja Puntos 664

Yo solo tuve un problema similar y encontró otra solución al sobrescribir el Estilo de la DataGridCell en la Mezcla.

El cambio de los elementos de la original estilo son las incubadoras para VerticalAlignment y VerticalContentAlignment en el mismo Estilo para estirar la propia célula y VerticalAlignment="Center" y HorizontalAlignment="Right" en la propiedad de Plantilla para alinear el contenido. Cambiar estos valores para lo que sea necesario para alinear las células contenido.

El resto del estilo podría ser eliminado para que la configuración de la base de estilo se utiliza (utilizando el StaticResource el estilo es BasedOn). Sin embargo, me dejó el estilo de Mezcla producida.

Este XAML resultante de Código debe ser incluido en los recursos de los controles:

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

5voto

MichaelS Puntos 2560

Usted puede tratar de un trabajo en torno a:

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

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X