我尝试解决这个问题。我有可绑定的richTextBox用于Text和Document属性,此控件派生自Extended WPF Toolkit中的richTextBox。
我的场景是:用户正在向richTextBox输入一些文本,如果他写了文本表情符号,我想将此文本表情符号转换为图像表情符号,并将其显示在richTextBox中。
例如:Hello world :) - > Hello world IMAGE_SMILE
我有自己的类,它将带有表情符号的字符串转换为带有文本和图像的段落类型。
这是它:
public Paragraph ConvertToMessageWithEmoticons(string rpText){...}
在WPF应用程序中,我绑定了richTextBox控件的Text和Document属性的属性。
//bind on Text property of richTextBoxControl
public string RtbText
{
get { return _rtbText; }
set
{
_rtbText = value;
NotifyPropertyChanged("RtbText");
}
}
//bind on Document property of richTextBoxControl
public FlowDocument RtbFlowDocument
{
get { return _rtbFlowDocument; }
set
{
_rtbFlowDocument = value;
NotifyPropertyChanged("RtbFlowDocument");
}
}
我使用Reactive Extensions for .NET(Rx)并在属性 RtbText上构建Observer
Observable.FromEvent<PropertyChangedEventArgs>(this, "PropertyChanged")
.Where(e => e.EventArgs.PropertyName == "RtbText")
.Select(_ => this.RtbText)
.Where(text => text.Length > 1)
.Do(AddSmiles)
.Throttle(TimeSpan.FromSeconds(500))
.Subscribe(AddSmiles);
我的问题是用表情符号将文本微笑替换成文本是多么优雅。我试试这个:
private void AddSmiles(string text)
{
Paragraph paragraph = _smileConverter.ConvertToMessageWithEmoticons(RtbText);
RtbFlowDocument.Blocks.Clear();
RtbFlowDocument.Blocks.Add(paragraph);
}
我尝试只检查RtbText中最后3个字符的微笑,但如果用户输入属性RtbText仍在更改。
在用户输入时如何用微笑将文本替换为文本的任何建议?
答案 0 :(得分:1)
我之前已经实现了这样的类(封闭源代码,否则我会分享)。当用户点击退格时,棘手的部分是管理插入符号的位置 - 因此您需要将Smiley转换回:-
,同时处理边缘情况(段落的开头/结尾,文档等)< / p>
答案 1 :(得分:0)
如果你得到插入符号位置,你可以在文本改变时查找克拉周围的字符(前3个和后3个)。