새 행의 선택 가능 영역을 작게 만들지 않고 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을 제거하면 영역은 원하는 대로 작동하지만 물론 올바른 정렬이 손실됩니다.
둘 다 할 수 있는 방법 아는 사람?
내가 시도했던 것들
- 바인딩의 TargetNullValue를 폭의 형식으로 설정합니다.이 기능은 기존 행에서 작동하지만 새 행에는 영향을 주지 않습니다.
- 컬럼에 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
'source' 카테고리의 다른 글
Swift에서 문자열을 최신 상태로 변환 (0) | 2023.04.19 |
---|---|
C#/WPF: ViewModel의 모든 속성에 대해 Property Changed? (0) | 2023.04.14 |
콘텐츠가 화면에 맞았을 때 UITableView 테이블 스크롤을 비활성화하는 방법 (0) | 2023.04.14 |
어레이 요소를 ParamArray를 통해 함수에 전달하면 varpointer가 함수에 도달하는 이유는 무엇입니까? (0) | 2023.04.14 |
"비원자"라는 성질이 무슨 뜻이죠? (0) | 2023.04.14 |