Programing

새 행에서 선택 가능한 영역을 작게 만들지 않고 WPF DataGrid 셀을 오른쪽 정렬하는 방법은 무엇입니까?

lottogame 2020. 12. 24. 23:18
반응형

새 행에서 선택 가능한 영역을 작게 만들지 않고 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}">

당신은 적용 할 수있는 ElementStyleDataGridTextColumn에 타겟이 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>

I just had a similar problem and found another solution by overwriting the Style for the DataGridCell in Blend.

The changed items from the original style are the setters for VerticalAlignment and VerticalContentAlignment in the Style itself to stretch the cell itself and VerticalAlignment="Center" and HorizontalAlignment="Right" in the Template property to align the content. Change these values to whatever you need to align the cells content.

The rest of the style could be removed so that the settings from the base style will be used (using the StaticResource the style is BasedOn). However I left the style as Blend produced it.

This resulting XAML-Code should then be included into the controls resources:

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

I had the same issue and got it solved now. If you want to do it inside the c# code, you need to set a bunch of setters:

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

반응형