首页 文章

WPF ListView突出显示颜色不会更改

提问于
浏览
1

我有一个ListView,每个Item有三个TextBlock . 第一个具有默认颜色(黑色),其他具有前景属性设置为灰色 .

当我选择一个项目时,第一个TextBlock的颜色变为蓝色,但其他颜色保持灰色并且难以阅读 .

我想要在选择项目时所有文本都变成白色 . 我怎么做的?

编辑:我的风格:

<UserControl.Resources>
        <Style TargetType="{x:Type ListViewItem}">
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="Foreground" Value="White"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </UserControl.Resources>

我的ListView

<ListView  x:Name="lvResultat"  Grid.Row="0" Grid.Column="1" Background="{x:Null}"  
                      Margin="4"                       
                      HorizontalContentAlignment="Stretch"
                           ScrollViewer.VerticalScrollBarVisibility="Auto"
                      ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                      IsSynchronizedWithCurrentItem="True"    

                      ItemsSource="{Binding ResultatsRecherche}" SelectedItem="{Binding ResultatSelectione, Mode=TwoWay}" BorderBrush="{x:Null}" MouseDoubleClick="lvResultat_MouseLeftDoubleClick" >
        <ListView.ItemTemplate>
            <DataTemplate DataType="viewModel:ResultatRechercheViewModel">
                <Grid Height="86" Margin="2"  >
                    <Grid.RowDefinitions>
                        <RowDefinition Height="1.5*"/>
                        <RowDefinition Height="1*"/>
                        <RowDefinition Height="1*"/>
                        <RowDefinition Height="0.5*"/>
                    </Grid.RowDefinitions>
                    <TextBlock Text="{Binding Titre}" 
                                       FontSize="20" FontWeight="Bold"  />
                    <TextBlock Text="{Binding SousTitre}" Grid.Row="1" 
                                       FontStyle="Italic" Foreground="Gray"/>
                    <TextBlock Text="{Binding Resume}" Grid.Row="2"  TextTrimming="WordEllipsis"
                                        Foreground="Gray"/>

                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

我也尝试过类似的东西

<Style TargetType="ListViewItem">
    <Style.Resources>
        <!--<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="White" />-->
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="White" />
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="White" />
    </Style.Resources>
</Style>

编辑2:我发现自定义样式会更改Textblock的颜色,其默认属性为Foreground(黑色) . 如果我为第一个文本块的文本颜色指定黑色,则在选择项目时文本不再更改颜色 .

图片:
enter image description here

3 回答

  • 3

    前景尝试使用listView项目的样式:

    <Style TargetType="{x:Type ListViewItem}">
          <Style.Triggers>
               <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Foreground" Value="White"/>
               </Trigger>
           </Style.Triggers>
     </Style>
    
  • 0

    您可以通过将代码从 DataTemplate 转换为 ListViewItem 到具有 ControlTemplate 来实现您要执行的操作

    这是我试过的:

    ListViewItem样式:

    <Style TargetType="ListViewItem">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListViewItem}">
                    <Border x:Name="ContentBorder"
                                    Background="{TemplateBinding Background}"
                                    BorderBrush="{TemplateBinding BorderBrush}"
                                    BorderThickness="{TemplateBinding BorderThickness}"
                                    Margin="4">
                        <Grid Height="86" Margin="2"  >
                            <Grid.RowDefinitions>
                                <RowDefinition Height="1.5*"/>
                                <RowDefinition Height="1*"/>
                                <RowDefinition Height="1*"/>
                                <RowDefinition Height="0.5*"/>
                            </Grid.RowDefinitions>
                            <TextBlock Text="{Binding Titre}" 
                                   FontSize="20" FontWeight="Bold"  />
                            <TextBlock Text="{Binding SousTitre}" Grid.Row="1" Name="st"
                                   FontStyle="Italic" Foreground="Gray"/>
                            <TextBlock Text="{Binding Resume}" Grid.Row="2"  TextTrimming="WordEllipsis" Name="r"
                                    Foreground="Gray"/>
                        </Grid>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="Foreground" TargetName="st" Value="White" />
                            <Setter Property="Foreground" TargetName="r" Value="White" />
                            <Setter Property="Background" TargetName="ContentBorder"  Value="DeepSkyBlue" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

    然后我从 ListView XAML中删除了DataTemplate:

    <ListView  x:Name="lvResultat"  Grid.Row="0" Grid.Column="1" Background="{x:Null}"  
               Margin="4"                       
               HorizontalContentAlignment="Stretch"
               ScrollViewer.VerticalScrollBarVisibility="Auto"
               ScrollViewer.HorizontalScrollBarVisibility="Disabled"
               IsSynchronizedWithCurrentItem="True"    
               ItemsSource="{Binding ResultatsRecherche}" SelectedItem="{Binding ResultatSelectione, Mode=TwoWay}" BorderBrush="{x:Null}" >
    </ListView>
    

    但是,如果你必须使用 DateTemplate ,那么你可以做的是在 ViewModelResultatRechercheViewModel 上有一个名为 IsSelected 的属性,然后在 DataTemplate 中的该属性上有DataTriggers .

    更新的DataTemplate:

    <ListView.ItemTemplate>
        <DataTemplate DataType="viewModel:ResultatRechercheViewModel">
            <Grid Height="86" Margin="2"  >
                <Grid.RowDefinitions>
                    <RowDefinition Height="1.5*"/>
                    <RowDefinition Height="1*"/>
                    <RowDefinition Height="1*"/>
                    <RowDefinition Height="0.5*"/>
                </Grid.RowDefinitions>
                <TextBlock Text="{Binding Titre}" 
                               FontSize="20" FontWeight="Bold"  />
                <TextBlock Text="{Binding SousTitre}" Grid.Row="1"  Name="st"
                               FontStyle="Italic" Foreground="Gray"/>
                <TextBlock Text="{Binding Resume}" Grid.Row="2"  TextTrimming="WordEllipsis" Name="r"
                                Foreground="Gray"/>
    
            </Grid>
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding IsSelected}" Value="True">
                    <Setter Property="Foreground" TargetName="st" Value="White" />
                    <Setter Property="Foreground" TargetName="r" Value="White" />
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ListView.ItemTemplate>
    

    并且,您需要更新 ViewModel 代码以设置 IsSelected 属性,以下是我的MainViewModel中的代码:

    public ResultatRechercheViewModel ResultatSelectione
    {
        get { return _resultatSelectione; }
        set
        {
            if (_resultatSelectione != null)
            {
                _resultatSelectione.IsSelected = false;
            }
    
            _resultatSelectione = value;
    
            _resultatSelectione.IsSelected = true;
        }
    }
    

    希望这可以解决您的问题或给您一些解决问题的想法 .

  • 4

    试试这个语法

    <ListView>
        <ListView.ItemContainerStyle>
            <Style TargetType="{x:Type ListViewItem}">
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                         <Setter Property="Foreground" Value="White"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </ListView.ItemContainerStyle>
        ...
    </ListView>
    

相关问题