xaml add - 새로운 행에 선택 영역을 작게 만들지 않고 WPF DataGrid 셀을 오른쪽 정렬하는 방법은 무엇입니까?




row (5)

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

Answers

방금 비슷한 문제가 발생하여 Blend의 DataGridCell 스타일을 덮어 씀으로써 또 다른 해결책을 찾았습니다.

원래 스타일에서 변경된 항목은 셀 자체를 늘리는 Style 자체의 VerticalAlignmentVerticalContentAlignment 에 대한 설정자 및 Template 속성의 VerticalAlignment="Center"HorizontalAlignment="Right" 로 내용을 정렬합니다. 셀 내용을 정렬하는 데 필요한 값으로이 값을 변경하십시오.

나머지 스타일은 기본 스타일의 설정 이 사용 되도록 제거 할 수 있습니다 (스타일은 BasedOn 인 StaticResource 사용). 그러나 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>

TextBlock 대상으로하는 DataGridTextColumnElementStyle 을 적용하고 올바르게 정렬하면 효과적입니다.

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

해결 방법을 시도해 볼 수 있습니다.

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

향후 코드 검색에 대한 예제를 추가하고 싶었습니다.

나는 이것을 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 변환기를 사용하여 채색됩니다.


이 문제가 발생하여 DataGrid가 가상화를 사용하고 있습니다. 선택한 DataGridRow를 화면에서 스크롤 할 때 DataGridRow 비주얼 요소가 삭제되고 새 요소가 만들어 지거나 DataGrid의 VirtualizingStackPanel.VirtualizationMode 속성이 설정된 경우 Recycling - 그것은 행이 뷰포트에 들어갈 때 재사용됩니다.

두 이벤트가 발생하면 IsSelectedProperty 속성이 설정된 ViewModel과 IsSelectedProperty 속성이 설정된 DataGridRow 간의 바인딩이 끊어집니다.

이 경우를 확인하려면 DataGrid의 EnableRowVirtualization 속성을 false로 설정하십시오.

필자는 가상화를 사용하여 필요한 성능을 필요로하고 Attached Behaviors를 사용하여 선택 가능성을 구현했습니다. 특히 행을 클릭하면 LeftClickCommand 연결된 동작을 사용하여 IsSelectedProperty 를 설정하는 ViewModel에서 대리자 명령을 호출합니다. 그런 다음 DataGridRow의 스타일에서 IsSelectedProperty 에 바인딩 된 DataTrigger 를 사용하여 행을 강조 표시했습니다.

이 솔루션은 기본적으로 자체 선택 메커니즘을 포함하지만 행 가상화 및 MVVM 친숙한 행 선택을 얻는 유일한 방법이었습니다.





wpf xaml datagrid