在ListView中格式化文本?

时间:2012-06-04 17:18:54

标签: c# listview formatting listviewitem

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

我希望聊天消息呈现在游戏中:游戏在角色的类别之后为聊天中的那些“说话”的名称着色(例如,流氓的名字是黄色,法师的名字是淡蓝色),但是当谈到ListViewItemListViewSubItem时,着色文本似乎是一种全有或全无的交易。

是否有可能为ListView添加功能,以便根据ListViewItem中的标记将格式(或只是颜色)应用于ListViewSubItemText中的文字属性?

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

2 个答案:

答案 0 :(得分:1)

Windows窗体使用情况角度讲,您可以手动渲染项目。但是,您还应该考虑以下情况:当文本超出Control /列的范围时,应该如何呈现文本?

这只要求你继承ListView;您可以使用以下方式呈现每个项目:

protected override void OnDrawItem(DrawListViewItemEventArgs e)

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

如果您不介意GPL,ObjectListView确实提供了更多格式选项,但可能并不像您要求的那样灵活。

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

答案 1 :(得分:0)

我不完全确定这会起作用,我无法真正测试它,但它可能值得一试

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

这里的基本想法是,在列表框项目中,您有一个我认为包含文本块的内容呈现器。在此范围内,您可以设置单独的运行标记(单个文本的位),您可以以不同方式格式化每个标记。您还应该能够在为运行标记指定名称

时以编程方式设置文本