我正在创建我的第一个WPF应用程序,这是一个IRC聊天程序。由于我是WPF的新手,我真的不知道应该如何显示消息,因为它们可以包含粗体,斜体字或甚至图像,或者退出消息还有其他颜色,然后是简单消息。
我在网上搜索,我找到了一些解决方案。第一种解决方案是使用带有FlowDocument的RichTextBox或只是一个简单的FlowDocument,并以某种方式破解其绑定系统以显示属性的值。关于“黑客”我的意思是,这些控件没有绑定属性,因为它们不是DependencyObjects。 (我不确定这是正确的表达方式。)
在一个简单的TextBlock中,我无法显示消息,因为它显示了字符串的值。在一个简单的字符串中包含大量消息并向其中添加新消息之后需要大量的内存副本,因为无法修改字符串。 此外,如果我使用TextBlock,那么我可以用鼠标选择它的内容从中复制吗?如果我使用只读文本框,那么我可以只使用一个单词样式吗?
所以我即将使用ListView或其他可以显示List(或任何集合)内容的东西,然后修改其模板以正确显示每条消息。 (并以某种方式禁用ListView的选择)但我不知道我应该使用什么控件来显示它们时尚的消息并使它们可选择。
使用列表来存储消息会很酷,因为在有大约1000条消息之后,我想删除前100条消息,将它们保存在日志文件中。
所以我对如何解决这个问题感到很困惑。我希望有人能为这类问题找到合适的解决方案!
答案 0 :(得分:0)
嗯,如你所知,有很多可能性。
其中一种可能性是ObservableCollection<string>
每个元素都是HTML。您可以使用ListBox / ItemsControl绑定这些行。在ItemsControl DataTemplate上,您可以添加TextBlock元素并将其绑定到字符串的Text属性。
诀窍是使用转换器,它可以修改TextBlock的Inlines集合,并从HTML字符串为TextBlock生成具体的Run()元素。请注意,TextBlock可以在/每个单词不同的颜色和更多有用的东西。互联网上到处都是这样的项目(google TextBlock显示HTML)。
实现Image会更加棘手。据我所知,你不能把它放入TextBlock。这取决于您的要求如何允许插入图像。您可能需要将一行拆分为“多个”TextBlocks,其中有Image()元素。
然后有RichTextDocument,但对于IRC客户端来说听起来不太好。你不需要很多功能,它会让事情复杂化,而且速度会慢一些。