source

새 행의 선택 가능 영역을 작게 만들지 않고 WPF DataGrid 셀을 오른쪽으로 정렬하려면 어떻게 해야 합니까?

factcode 2023. 4. 14. 22:12
반응형

새 행의 선택 가능 영역을 작게 만들지 않고 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 셀

CellStyle을 제거하면 영역은 원하는 대로 작동하지만 물론 올바른 정렬이 손실됩니다.

적절한 폭의 DataGrid 셀

둘 다 할 수 있는 방법 아는 사람?

내가 시도했던 것들

  1. 바인딩의 TargetNullValue를 폭의 형식으로 설정합니다.이 기능은 기존 행에서 작동하지만 새 행에는 영향을 주지 않습니다.
  2. 컬럼에 MinWidth를 설정해도 새로운 행 선택 가능 영역의 폭에는 영향을 주지 않습니다.

효과가 있었던 것:

@AngelWPF의 응답 정보를 사용하여 다음과 같이 CellStyle을 사용하는 것에서 ElementStyle을 사용하는 것으로 변경할 수 있었습니다.

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

되었다

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

신청할 수 있다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> 

향후 코드 검색을 위해 더 많은 예를 추가하고자 합니다.

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>

그리고 데이터 그래피드에서:

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

비슷한 문제가 있어서 Blend에서 Style for the DataGridCell을 덮어쓰면서 다른 해결책을 찾았습니다.

원래 스타일에서 변경된 아이템은 다음 세터입니다.VerticalAlignment그리고.VerticalContentAlignment셀 자체를 늘리기 위한 스타일 자체와VerticalAlignment="Center"그리고.HorizontalAlignment="Right"[ Template ]속성에 내용을 정렬합니다.셀 내용을 정렬하는 데 필요한 값으로 값을 변경합니다.

기본 스타일의 설정이 사용되도록 나머지 스타일을 제거할 수 있습니다(StaticResource를 사용하면 스타일은 BasedOn).하지만 저는 Blend가 제작하는 대로 스타일을 남겨두었습니다.

다음으로 XAML-Code를 제어 리소스에 포함해야 합니다.

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

저도 같은 문제가 있어서 지금 해결했어요.c# 코드 내에서 이 작업을 수행하려면 여러 개의 setter를 설정해야 합니다.

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;

언급URL : https://stackoverflow.com/questions/7800367/how-to-get-a-wpf-datagrid-cell-to-right-align-without-making-the-selectable-area

반응형