Подтвердить что ты не робот

Как получить ячейку 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>

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

DataGrid cell with tiny width

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

DataGrid cell with proper width

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

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

  • Настройка TargetNullValue на привязку к формату с некоторой шириной. Это работает с существующими строками, но не влияет на новую строку.
  • Установка MinWidth в столбце, это не повлияло на ширину выбранной строки область.

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

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

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

Стала

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

Ответ 1

Вы можете применить ElementStyle к DataGridTextColumn, нацеленному на 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> 

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

У меня была аналогичная проблема, и я нашел другое решение, перезаписав стиль для DataGridCell в Blend.

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

Остальная часть стиля может быть удалена, так что будут использоваться настройки из базового стиля (с использованием 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>

Ответ 5

У меня была та же проблема, и я решил ее сейчас. Если вы хотите сделать это внутри кода С#, вам нужно установить несколько сеттеров:

DataGridTextColumn numColumn = new DataGridTextColumn
Style s = new Style();
s.Setters.Add(new Setter(HorizontalAlignmentProperty, HorizontalAlignment.Stretch));
s.Setters.Add(new Setter(HorizontalContentAlignmentProperty, HorizontalAlignment.Right));
s.Setters.Add(new Setter(TextBlock.HorizontalAlignmentProperty, HorizontalAlignment.Stretch));
s.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));
numColumn.CellStyle = s;