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

如何创建并呈现包含部分斜体文本的ListboxItem

解决WPF ListBox项混合样式与交互失效问题

核心思路

别直接用Inline/Run当ListBox的项,这会破坏ListBox原生的选择、悬停交互。正确做法是:定义数据模型存储文本内容,通过ItemTemplate自定义每个项的布局,用TextBlock嵌套多个Run实现局部样式。


步骤1:创建数据模型

先定义一个类来存储每个项的主文本和注释文本:

public class ListItemModel
{
    public string MainText { get; set; }
    public string CommentText { get; set; }
}

步骤2:修改ViewModel

把原来的List<Inline>替换为List<ListItemModel>,填充需要的数据:

namespace SandboxListBox
{
    public class ViewModel : INotifyPropertyChanged
    {
        public ViewModel()
        {
            Items = new List<ListItemModel>
            {
                new ListItemModel { MainText = "常规文本项", CommentText = "(这是斜体注释)" },
                new ListItemModel { MainText = "另一个常规项", CommentText = string.Empty },
                new ListItemModel { MainText = "带注释的项", CommentText = "(特殊说明)" }
            };
        }

        private List<ListItemModel> items;
        public List<ListItemModel> Items
        {
            get => items;
            set
            {
                items = value;
                OnPropertyChanged();
            }
        }

        private ListItemModel selectedItem;
        public ListItemModel SelectedItem
        {
            get => selectedItem;
            set
            {
                selectedItem = value;
                OnPropertyChanged();
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

步骤3:设置ListBox的ItemTemplate

在XAML里给ListBox指定自定义模板,用TextBlock包含两个Run,分别显示主文本和斜体注释:

<Window x:Class="SandboxListbox.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:SandboxListBox"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.DataContext>
        <local:ViewModel/>
    </Window.DataContext>
    <Grid>
        <ListBox ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock>
                        <Run Text="{Binding MainText}"/>
                        <Run Text="{Binding CommentText}" FontStyle="Italic" Foreground="Gray"/>
                    </TextBlock>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Window>

问题解析

  1. 局部样式问题:通过在TextBlock里嵌套多个Run,可以给每个Run单独设置样式(斜体、颜色等),轻松实现同一行文本的混合样式。
  2. 交互失效问题:原来直接用Inline作为项,ListBox会把Inline直接作为ListBoxItem的内容,替换了默认的容器模板,导致悬停、选择逻辑失效。用数据模型+ItemTemplate的方式,保留了ListBoxItem的原生容器,所有交互逻辑正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 07:17:04