我想要自己的Instant Messager(聊天)。普通文本框不支持格式化/彩色文本。 我在WPF中阅读了一些关于Richtextbox的文章,并且使用Blocks,Paragraphs和Runs的新概念非常有趣。 序列化这些对象并将它们发送给其他聊天客户端是一个好主意吗? (文本应格式化,如作者的原始文本) 如果我想将输入文本框中的块添加到输出文本框(仅用于测试),我会得到一个例外,即块/段落被其他richtextbox使用。 然后我从这些对象中保存了引用,将其从第一个文本框中删除并将它们添加到第二个文本框中。
For example:
FlowDocument oldTextDocument = richTextBoxMessageBox.Document;
richTextBoxMessageBox.Document = new FlowDocument();
while(oldTextDocument.Blocks.Count > 0)
{
richTextBoxChatHistory.Document.Blocks.Add(oldTextDocument.Blocks.FirstBlock);
}
(我不能用for-each做,因为这会导致异常。)
答案 0 :(得分:1)
我认为将序列化对象发送给其他客户端并不是一个好主意,因为它们会产生一些(相当大的)开销。
我前段时间做了一个聊天应用程序,我使用(成功)WebBrowser作为聊天窗口中的主要控件(支持很多格式化,富媒体等),而我只通过网络发送html文本(加密的)。
关于你的代码,你不能在两个不同的控件中使用相同的Paragraph实例,因为它是一个ContentElement - 就像你在两个不同的面板中不能有相同的Label一样。
答案 1 :(得分:1)
Richtextbox就像我制作的即时聊天应用程序的魅力一样,只是确保你研究Flowdocument的行为并扩展她的基类。所以你可以使用属性改变c.q.依赖属性,写清洁代码。实际上你要小心填充一个段落,它必须在控制器中的属性上完成,而不是在表单后面的代码中。如果你想保持你的代码干净。请看一下:http://www.lebroitsolutions.nl/en/projects-chat.aspx。在哪里可以下载代码,我已经提供了更多信息。流式传输文件(不是整个文本框)的开销很小。