Как получить ячейку WPF DataGrid для выравнивания по правому краю, не делая выбираемую область на новой строке крошечной?


Я использую WPF4.0 элемента DataGrid. При двойном щелчке по ячейке в новой строке все работает нормально если я добавил стиль ячейки в этом столбце. Например, у меня есть числовой столбец, где я хочу, чтобы данные были выровнены по правому краю, поэтому xaml выглядит так

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

где стиль в общем ресурсе просто:

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

результирующая выбираемая область в новой строке отображается на изображении как эта небольшая синяя область.Это очень маленькая цель пользователь должен ударить, и это, скорее всего, столбец, который они захотят начать с новой строки.

если я удаляю CellStyle, область работает по желанию, но, конечно, я теряю правильное выравнивание.

кто-нибудь знает, как добиться?

вещи, которые я пробовал

  1. установка TargetNullValue на привязке к формату с некоторой шириной. Это работает на существующих строках, но не имеет никакого эффекта на новом ряду.
  2. установка MinWidth на колонке, это не повлияло на ширину новой строки выбирается область.

вещь, которая работала:

используя информацию из ответа @AngelWPF я смог перейти от использования CellStyle к использованию ElementStyle следующим образом:

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

стало

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

4 ответа:

вы можете подать заявку ElementStyle на DataGridTextColumn targetted к TextBlock и правильно выровнять, что это будет работать.

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

просто хотел добавить больше примеров для будущих поисков кода.

Я поместил это в верхней части файла 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>

и затем в datagrid:

<DataGridTextColumn Header="Excluded" Binding="{Binding Excluded}" ElementStyle="{StaticResource RightCell}"/>

это право выравнивает текст и сортировка по-прежнему включена. Текстовое поле заполняет ячейку и в этом случае окрашивается с помощью конвертера bool.

вы можете попробовать обойти:

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

Я просто имел аналогичную проблему и нашел другое решение путем перезаписи стиля для DataGridCell в Blend.

измененные элементы из исходного стиля являются сеттеры для VerticalAlignment и VerticalContentAlignment в самом стиле растянуть саму ячейку и VerticalAlignment="Center" и HorizontalAlignment="Right" в свойстве шаблона для выравнивания содержимого. Измените эти значения на все, что вам нужно для выравнивания содержимого ячеек.

остальная часть стиля может быть удалены, так что будут использоваться настройки из базового стиля (с помощью StaticResource стиль BasedOn). Однако я оставил стиль, поскольку Blend произвел его.

этот результирующий XAML-код должен быть включен в ресурсы элементов управления:

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