You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改ListBox中SelectedItem(选中项)的颜色?

嘿,针对你这个要修改ListBox选中项颜色的需求,我给你几个实用的可行方案,适配你现有的代码结构:

方案1:重写ListBoxItem模板(适配UWP/WinUI)

因为你用了x:Bind,大概率是UWP或者WinUI环境,这种情况下通过重写ListBoxItem的控件模板,能精准控制选中状态的视觉表现:

<ListBox x:Name="ListBoxQuestionAnswers" 
         ItemsSource="{x:Bind Question.Answers}" 
         SelectionMode="Single" 
         SelectionChanged="ListBoxQuestionAnswers_OnSelectionChanged">
    <!-- 新增ItemContainerStyle来定义选中样式 -->
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ListBoxItem">
                        <Grid x:Name="RootGrid" Background="{TemplateBinding Background}">
                            <VisualStateManager.VisualStateGroups>
                                <VisualStateGroup x:Name="SelectionStates">
                                    <!-- 未选中状态 -->
                                    <VisualState x:Name="Unselected"/>
                                    <!-- 选中且聚焦状态 -->
                                    <VisualState x:Name="Selected">
                                        <VisualState.Setters>
                                            <Setter Target="RootGrid.Background" Value="#FF2196F3"/> <!-- 自定义选中背景色 -->
                                            <Setter Target="ContentPresenter.(ContentPresenter.Content).Foreground" Value="White"/> <!-- 自定义选中文字色 -->
                                        </VisualState.Setters>
                                    </VisualState>
                                    <!-- 选中但未聚焦状态 -->
                                    <VisualState x:Name="SelectedUnfocused">
                                        <VisualState.Setters>
                                            <Setter Target="RootGrid.Background" Value="#FF2196F3"/>
                                            <Setter Target="ContentPresenter.(ContentPresenter.Content).Foreground" Value="White"/>
                                        </VisualState.Setters>
                                    </VisualState>
                                </VisualStateGroup>
                            </VisualStateManager.VisualStateGroups>
                            <ContentPresenter x:Name="ContentPresenter" 
                                              Content="{TemplateBinding Content}" 
                                              ContentTemplate="{TemplateBinding ContentTemplate}"
                                              HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ListBox.ItemContainerStyle>

    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock x:Name="TextBlockInListBox" TextWrapping="Wrap" Text="{Binding}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

你可以把代码里的#FF2196F3(蓝色背景)和White(白色文字)改成你需要的颜色值,这种方式能同时覆盖“选中聚焦”和“选中未聚焦”两种状态,避免样式不一致。

方案2:使用触发器(适配WPF)

如果你的项目是WPF环境(WPF从.NET 4.5开始也支持x:Bind),可以用更简洁的触发器写法,不需要重写模板:

<ListBox x:Name="ListBoxQuestionAnswers" 
         ItemsSource="{x:Bind Question.Answers}" 
         SelectionMode="Single" 
         SelectionChanged="ListBoxQuestionAnswers_OnSelectionChanged">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="Background" Value="#FF2196F3"/> <!-- 选中背景色 -->
                    <Setter Property="Foreground" Value="White"/> <!-- 选中文字色 -->
                    <Setter Property="FontWeight" Value="Bold"/> <!-- 可选:给选中项加粗 -->
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListBox.ItemContainerStyle>

    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock x:Name="TextBlockInListBox" TextWrapping="Wrap" Text="{Binding}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

这种写法通过监听IsSelected属性的变化,自动应用样式,代码更简洁,适合不需要复杂视觉状态的场景。

方案3:全局复用样式

如果多个ListBox都需要相同的选中样式,可以把样式放到资源字典里(比如App.xaml或者当前页面的Resources节点),方便全局复用:

<!-- 在页面的Resources里定义样式 -->
<Page.Resources>
    <Style x:Key="CustomListBoxItemStyle" TargetType="ListBoxItem">
        <!-- 这里放方案1或方案2的样式内容 -->
    </Style>
</Page.Resources>

<!-- 在ListBox里引用样式 -->
<ListBox x:Name="ListBoxQuestionAnswers" 
         ItemContainerStyle="{StaticResource CustomListBoxItemStyle}"
         ItemsSource="{x:Bind Question.Answers}" 
         SelectionMode="Single" 
         SelectionChanged="ListBoxQuestionAnswers_OnSelectionChanged">
    <!-- 你的ItemTemplate -->
</ListBox>

另外补充一句:因为你的ItemsSource是List<string>,DataTemplate里直接绑定字符串,所以设置ListBoxItem的Foreground会直接作用到TextBlock的文字颜色,不需要额外在TextBlock上绑定属性哦。

内容的提问来源于stack exchange,提问作者tayabuz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:13:27