设置列表视图中文本的格式

本文关键字:格式 文本 中文 列表 视图 设置 | 更新日期: 2023-09-27 18:36:17

我正在创建一个小应用程序,它将读取,解析和格式化lua脚本的内容 - 特别是由"大象"聊天日志记录插件创建的魔兽世界中SavedVariables文件。我想到的原型将生成一个ListViewItem实例数组,显示时间戳、玩家名称、消息发布到哪个频道以及发布的消息。

我希望将聊天消息呈现为游戏中的样子:游戏在角色的职业之后为聊天中"说话"的人的名字着色(例如,盗贼的名字是黄色的,法师的名字是浅蓝色的),但是当涉及到ListViewItemListViewSubItem时,着色文本似乎有一个全有或全无的交易。

是否可以为ListView添加功能,以根据 Text 属性中的标记将格式(或仅颜色)应用于ListViewItemListViewSubItem中的文本?

编辑:我问是否有可能通过派生类中的继承/多态魔术将文本格式添加到 ListViewItem,如果是这样,最好的方法是什么(工作量、代码安全性等)?

设置列表视图中文本的格式

Windows 窗体使用的角度来看,您可以手动呈现这些项。但是,您还应考虑以下情况:当文本超出Control/列的边界时,应如何呈现文本?

这只需要你从ListView继承;你可以使用以下方法渲染每个项目:

protected override void OnDrawItem(DrawListViewItemEventArgs e)

当然,OwnerDraw必须设置为 true . DrawListViewItemEventArgs包含需要呈现的文本以及应用于呈现文本的Graphics实例。然后,可以使用DrawString(string s, Font font, Brush brush, float x, float y)按照标记约定的要求呈现文本的每个部分。

如果你不介意GPL,ObjectListView确实提供了更多的格式化选项,但也许它不像你需要的那么灵活。

由于RichTextBox确实允许灵活的文本格式,我想知道它是否可以以某种方式用作渲染器......

我不完全确定这是否有效,我无法真正测试它,但可能值得一试

<ListViewItem>
   <ContentPresenter>
       <TextBlock>
          <Run x:Name="playerName" Foreground="Blue" Text="NAME"/>
          <Run x:Name="etc" Foreground="Black" Text="..."/>
        </TextBlock>
     </ContentPresenter>
 </ListViewItem>

这里的基本思想是,在列表框项中,您有一个我认为包含文本块的内容演示器。在此范围内,您可以设置单独的 Run 标记(单个文本的位),并且可以以不同的方式设置每个标记的格式。您还应该能够在为运行标记分配名称时以编程方式设置文本