sourcetip

wpf: DataGrid 선택한 행 스타일 사용 안 함 - 또는 행 선택

fileupload 2023. 4. 28. 21:16
반응형

wpf: DataGrid 선택한 행 스타일 사용 안 함 - 또는 행 선택

DataGrid에서 Selected 행의 스타일을 지정하는 방법에 대한 예를 많이 볼 수 있습니다. 예를 들어 다음과 같습니다.

데이터 그리드에서 선택한 행의 색상을 설정하는 방법

선택한 행 스타일을 비활성화할 수 있습니까?선택한 행이 변경된 모든 항목을 재정의할 필요는 없습니다.눈에 보이는 변화를 원하지 않을 뿐입니다.템플릿을 만드는 것보다 쉬운 방법이어야 합니다.

아니면..

행을 선택하지 않도록 설정합니다.하지만 이 포럼을 검색해보니 역시 촌스러워 보입니다.

WPF 데이터 그리드에서 선택 사용 안 함

선택 스타일을 없애기 위해 XAML을 찾았습니다.이상적이지는 않지만, 충분히 가깝습니다.

<Style x:Key="CellStyle" TargetType="{x:Type DataGridCell}">
    <Setter Property="Foreground" Value="Black" />
    <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="Background" Value="{x:Null}" />
            <Setter Property="BorderBrush" Value="{x:Null}" />
        </Trigger>
    </Style.Triggers>
</Style>

제가 성공한 것은 다음과 같습니다.

<DataGrid>
    <DataGrid.CellStyle>
        <Style TargetType="{x:Type DataGridCell}">
            <Style.Triggers>
                <Trigger Property="DataGridCell.IsSelected" Value="True">
                    <Setter Property="BorderBrush">
                        <Setter.Value>
                            <SolidColorBrush Color="Transparent"/>
                        </Setter.Value>
                    </Setter>
                    <Setter Property="Foreground"
                            Value="{DynamicResource
                                   {x:Static SystemColors.ControlTextBrushKey}}"/>
                    <Setter Property="Background">
                        <Setter.Value>
                            <SolidColorBrush Color="Transparent"/>
                        </Setter.Value>
                    </Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </DataGrid.CellStyle>
    <!-- ... -->
</DataGrid>

저는 제 상황에 맞는 다른 방법을 찾았습니다.사용자가 셀을 선택하지 않도록 하기 위해 모든 셀에 대해 이 스타일을 설정했습니다.

<Style TargetType="{x:Type DataGridCell}">
    <Setter Property="IsHitTestVisible" Value="False"/>
</Style>

두 번째 질문에 먼저 대답하겠습니다. 행 선택을 해제하려면 데이터 그리드의 RowStyle을 변경할 수 있습니다.

<DataGrid>
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Setter Property="IsEnabled" Value="False"/>
        </Style>
    </DataGrid.RowStyle>
    <!--Other DataGrid items-->
</DataGrid>

그러나 행 자체가 "비활성화"되어 있으므로 텍스트 스타일이 변경됩니다.또한 사용자가 행을 마우스 오른쪽 단추로 클릭하여 선택할 수 있다는 사실도 부정하지 않습니다.데이터 그리드 행과의 상호 작용을 비활성화하려면 다음을 수행할 수 있습니다.

<DataGrid>
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Setter Property="IsHitTestVisible" Value="False"/>
        </Style>
    </DataGrid.RowStyle>
    <!--Other DataGrid items-->
</DataGrid>

행은 여전히 사용 가능하므로 텍스트 스타일은 변경되지 않습니다.

이제 선택한 행의 스타일만 변경하고 기능은 그대로 둔다면 다음을 수행할 수 있습니다(기본적으로 @Dan Stevens의 답변과 동일합니다).ControlTextBrushKey는 시스템에서 텍스트 항목에 색상을 지정하는 데 사용되는 브러시입니다.DynamicResource와 StaticResource 간의 설명은 이 답변을 참조하십시오.

<DataGrid>
    <DataGrid.CellStyle>
        <Style TargetType="{x:Type DataGridCell}">
            <Style.Triggers>
                <Trigger Property="DataGridCell.IsSelected" Value="True">
                    <Setter Property="BorderBrush" Value="Transparent"/>
                    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
                    <Setter Property="Background" Value="Transparent"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </DataGrid.CellStyle>
    <!--Other DataGrid items-->
</DataGrid>

위의 솔루션은 DataGridRow의 스타일을 변경하지 않습니다.아래에서 볼 수 있는 것처럼 행이 선택된 경우의 헤더입니다(첫 번째 행이 선택됨).

여기에 이미지 설명 입력

이것은 비교적 간단합니다.

datagrid.SelectionChanged += (obj, e) =>
  Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() =>
    datagrid.UnselectAll()));

그러면 데이터 그리드에서 모든 선택이 비활성화됩니다.

선택을 완전히 비활성화하지 않고 숨기려면 템플릿을 수정해야 합니다.

다른 스타일의 셀을 가지고 있고 모든 스타일을 재정의하거나 각 스타일에 트리거를 추가하지 않으려는 저와 같은 사람들에게는 이 방법이 좋습니다.

<DataGrid.Resources>
    <SolidColorBrush 
        x:Key="{x:Static SystemColors.HighlightBrushKey}" 
        Color="#333333"/>
    <SolidColorBrush 
        x:Key="{x:Static SystemColors.HighlightTextBrushKey}" 
        Color="Black"/>
    <SolidColorBrush 
        x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" 
        Color="Black"/>
    <SolidColorBrush 
        x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}" 
        Color="Black"/>
</DataGrid.Resources>

HighlightBrushKey는 활성 선택과 함께 강조 표시된 테두리입니다.HighlightTextBrushKey선택 영역이 활성화된 텍스트 색상입니다.

이 경우 비활성 선택 항목을 선택하지 않은 것으로 표시합니다.

InactiveSelectionHighlightBrushKey선택이 비활성화된 경우의 경계입니다.InactiveSelectionHighlightTextBrushKey선택이 비활성화된 경우 텍스트입니다.

참고: SystemColors는 System의 일부인 정적 클래스입니다.창문들.미디어 네임스페이스입니다.당신은 그것을 검사하고 당신이 싫어하는 어떤 색도 뻔뻔스럽게 무시할 수 있습니다!

<Style TargetType="DataGridCell">
    <Style.Triggers>
        <Trigger Property="DataGridCell.IsSelected" Value="True">
            <Setter Property="BorderBrush" Value="Transparent"/> <!--Removes brush color change-->
            <Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Foreground}"/> <!--Removes foregound change-->
            <Setter Property="Background" Value="Transparent"/>  <!--Removes backgound change-->
        </Trigger>
    </Style.Triggers>
    <Setter Property="FocusVisualStyle" Value="{x:Null}"/> <!--Removes dotted border when on cell selection change made by keyboard-->
</Style>

스티븐스와 조슈아를 약간 수정했습니다밀러의 해결책.다음과 같은 경우 이 솔루션을 사용합니다.

  • 전경색이 다른 셀이 있는 경우 색상을 시스템 색상으로 재설정하지 않으려면 이 한 가지 방법을 사용해야 합니다.ControlTextBrushKey(텍스트 브러시 키)
  • 마우스 및 키보드로 셀(및 행) 선택을 비활성화하려는 경우

언급URL : https://stackoverflow.com/questions/3046988/wpf-datagrid-disable-selected-row-styles-or-row-selecting

반응형