programing tip

WPF ListView 비활성 선택 색상

itbloger 2020. 11. 20. 08:42
반응형

WPF ListView 비활성 선택 색상


여러 ListView를 연속으로 선택하는 WPF 응용 프로그램을 만들고 있습니다 (iTunes 브라우저와 유사). 문제는 기본 비활성 선택 색상이 너무 밝다는 것입니다. (아래 참조)기본 비활성 선택 색상 (너무 밝음)

비활성 목록보기가 다음과 같이 보이도록이 색상을 어떻게 변경할 수 있습니까? (아래 참조)비활성 및 활성 선택 색상이 동일 함

해결책

다음 Style과 같이 기본 SystemColor를 재정의합니다 .

<Style TargetType="ListViewItem">
    <Style.Resources>
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="{x:Static SystemColors.HighlightColor}"/>
    </Style.Resources>
</Style>

ListBox템플릿라는 시스템 색상 사용 ControlBrush비활성 강조 표시 색상을 설정합니다. 따라서 해당 색상을 재정의 할 수 있습니다.

<ListBox>
    <ListBox.Resources>
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}">Red</SolidColorBrush>
    </ListBox.Resources>
</ListBox>

변화 SystemColors.ControlBrushKey는 저에게 효과가 없었습니다.SystemColors.InactiveSelectionHighlightBrushKey

그래서 대신 :

<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Red" />

나는 사용해야했다 :

<SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="Red"/>

대답은 경우에 따라 문제를 해결하지만 컨트롤이 비활성화 / 읽기 전용 일 때 중단되고 색 구성표를 활용하는 대신 재정의하므로 이상적이지 않습니다. 내 제안은 대신 ListBox 태그에 다음을 추가하는 것입니다.

<ListBox....>
    <ListBox.Resources>
            <Style TargetType="ListBoxItem">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListBoxItem">
                            <Border Name="Border" Padding="2" SnapsToDevicePixels="true">
                                <ContentPresenter />
                            </Border>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsSelected" Value="true">
                                    <Setter TargetName="Border" Property="Background"
                                            Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
        </Style>
    </ListBox.Resources>
</ListBox>

이것이 할 일은 목록 상자 항목이 선택 될 때마다 (컨트롤 상태에 관계없이) 하이라이트 배경색을 설정하는 것입니다.

내 답변은 다음 블로그와 함께 이미 제공된 답변의 도움말을 기반으로합니다. http://blogs.vbcity.com/xtab/archive/2009/06/29/9344.aspx


SystemColors의 일부 속성을 재정의해야합니다. SystemColors 클래스 (MSDN)를 살펴보십시오 . InactiveSelectionHighlightBrushKey보다 더 많은 속성이 있습니다 (예 : 텍스트 색상에 영향을주는 InactiveSelectionHighlightTextBrushKey).

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red"/>
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="White"/>
        <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="Yellow"/>
        <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}" Color="Blue"/>
        <Style TargetType="ListViewItem">
            <Setter Property="FontSize" Value="20" />
            <Setter Property="FontWeight" Value="Bold" />
            <Setter Property="Padding" Value="25,5" />
        </Style>
    </Window.Resources>
    <StackPanel Orientation="Horizontal">
        <ListView>
            <ListViewItem Content="Item" />
            <ListViewItem Content="Item" />
        </ListView>
        <ListView>
            <ListViewItem Content="Item" />
            <ListViewItem Content="Item" />
        </ListView>
    </StackPanel>
</Window>

여기에 이미지 설명 입력


이전 .NET Frameworks에서는 시스템 색상을 재정의하는 기능이 작동하지 않습니다. .NET Framework 4.0에서 작동하는 솔루션이 여기 있습니다 .

<ListView>
<ListView.Resources>
<Style TargetType="{x:Type ListViewItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListViewItem}">
                <Border x:Name="Bd"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        Background="{TemplateBinding Background}"
                        Padding="{TemplateBinding Padding}"
                        SnapsToDevicePixels="true">
                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                        SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                        VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
                </Border>
                <ControlTemplate.Triggers>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="Selector.IsSelectionActive"
                                        Value="False" />
                            <Condition Property="IsSelected"
                                        Value="True" />
                        </MultiTrigger.Conditions>
                        <Setter Property="Background"
                                TargetName="Bd"
                                Value="DarkOrange" />
                    </MultiTrigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="Selector.IsSelectionActive"
                                        Value="True" />
                            <Condition Property="IsSelected"
                                        Value="True" />
                        </MultiTrigger.Conditions>
                        <Setter Property="Background"
                                TargetName="Bd"
                                Value="OrangeRed" />
                    </MultiTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

ListBox 및 ListView 모두에서 작동합니다.


이 다른 답변을 기반으로 실제 값을 하드 코딩하지 않고 활성 및 비활성 색상을 동일하게 만들기 위해 다음을 사용했습니다.

<ListBox.Resources>
    <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" 
                     Color="{x:Static SystemColors.HighlightColor}"/>
    <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}"
                     Color="{x:Static SystemColors.HighlightTextColor}"/>
</ListBox.Resources>

활성 및 비활성 모두에 대해 동일한 색상을 갖는 것은 이상적이지 않을 수 있지만 기본 색상이 너무 희미하여 비활성 상태 일 때 어떤 항목이 선택되었는지 알기가 어려웠습니다. 이것은 확실한 개선입니다.


나를 위해 이것은 트릭을했습니다.

 <ListBox HorizontalContentAlignment="Stretch">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Label  Margin="-5, -2,-5,-2" Content="{Binding Item}">
                            <Label.Style>
                                <Style TargetType="Label">
                                    <Style.Triggers>
                                        <MultiDataTrigger>
                                            <MultiDataTrigger.Conditions>
                                                <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBox}},Path=IsFocused}" Value="False"/>
                                                <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" Value="True"/>
                                            </MultiDataTrigger.Conditions>
                                            <Setter Property="Background" Value="CornflowerBlue"/>
                                        </MultiDataTrigger>
                                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" Value="True">
                                            <Setter Property="Foreground" Value="White"/>
                                        </DataTrigger>
                                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" Value="False">
                                            <Setter Property="Foreground" Value="Black"/>
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </Label.Style>
                        </Label>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

참고 URL : https://stackoverflow.com/questions/382006/wpf-listview-inactive-selection-color

반응형