【问题标题】:A WPF solution to display chat messages of an IRC application显示 IRC 应用程序聊天消息的 WPF 解决方案
【发布时间】:2014-01-13 09:29:32
【问题描述】:

我正在创建我的第一个 WPF 应用程序,它是一个 IRC 聊天程序。由于我是 WPF 的新手,我真的不知道应该如何显示这些消息,因为它们可以包含粗体、斜体字甚至图像,或者退出消息具有其他颜色而不是简单消息。

我在网上搜索并找到了一些解决方案。第一种解决方案是使用带有 FlowDocument 的 RichTextBox 或仅使用简单的 FlowDocument 并以某种方式破解它们的绑定系统以显示属性的值。关于“黑客”,我的意思是,这些控件没有绑定属性,因为它们不是 DependencyObjects。 (我不确定这是不是正确的表达方式)。

在一个简单的 TextBlock 中,我无法显示消息,因为它显示了字符串的值。在一个简单的字符串中包含大量消息并向其添加新消息后,需要大量内存副本,因为无法修改字符串。 此外,如果我使用 TextBlock,那么我可以用鼠标选择它的内容以从中复制吗?如果我使用只读文本框,那么我可以只为一个单词使用样式吗?

所以我即将使用 ListView 或可以显示 List(或任何集合)内容的东西,然后修改其模板以正确显示每条消息。 (并以某种方式禁用 ListView 的选择)但我不知道我应该使用什么控件来让消息显示它们时尚并使其可选择。

使用列表来存储消息会很酷,因为在拥有大约 1000 条消息之后,我想删除前 100 条以将它们保存在日志文件中。

所以我完全不知道如何解决这个问题。我希望有人会为这类问题提供适当的解决方案!

【问题讨论】:

  • 见 www.squiggle.codeplex.com

标签: .net wpf textblock messages flow-control


【解决方案1】:

嗯,你知道有很多可能性。

其中一种可能性是使用ObservableCollection<string>,其中每个元素都是 HTML。您可以使用 ListBox/ItemsControl 来绑定这些行。在 ItemsControl DataTemplate 上,您可以添加 TextBlock 元素并将其 Text 属性绑定到字符串。

诀窍是使用转换器,它可以修改 TextBlock 的 Inlines 集合并从 HTML 字符串为 TextBlock 生成具体的 Run() 元素。请注意,TextBlock 可以为每个单词添加不同的颜色和更多有用的东西。互联网上到处都是这样的项目(google TextBlock 显示 HTML)。

实现 Image 会比较棘手。据我所知,您不能将其放入 TextBlock。这取决于您的要求如何允许插入图像。您可能需要将一行拆分为“多个”文本块,其中之间有 Image() 元素。

然后是 RichTextDocument,但是对于 IRC 客户端来说听起来不太好。你不需要太多这样的功能,它会使事情复杂化并且速度较慢。

【讨论】:

  • 好吧,我也在考虑这个解决方案,但是TextBlocks有一个很大的缺点:它们的内容不能被选择,我认为这是这样一个应用程序的基本要求。
  • 这是一个论点。看看这个解决方案:stackoverflow.com/questions/136435/… 不太清楚这是否适合当前的问题,但在我的脑海深处,事情应该可以工作:p
  • 很遗憾没有。当我想从 TextBlock 中选择一条消息时,他们建议使用只读 TextBox,当我想在 TextBox 中设置样式时,他们建议使用 TextBlock。 ://
  • 是的。现在我更多地考虑了选择功能;它有什么特别之处?捕获开始和结束坐标并计算需要临时修改其背景的 Run() 元素集。 WPF 具有惊人的命中测试系统,它可以告诉您“xy”矩形上所有可能的 Run() 元素。听起来还不错。给定的“Squiggle”似乎使用 FlowDocument 来实现它的功能 => squiggle.codeplex.com/SourceControl/latest#Squiggle.UI/Controls/…
  • 我早上可能吃了太多的狮子食物 - 计算正确的选择区域并在正确的边界上临时进行“运行”元素拆分绝非易事,只能用于研究目的,或者如果 RTF 提供的太笨拙和缓慢。就像 SQuiggle 一样,使用 FlowDocument 会更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多