在用户键入期间使用Smiles将文本转换为文本

时间:2011-01-07 15:03:59

标签: wpf richtextbox flowdocument system.reactive

我尝试解决这个问题。我有可绑定的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仍在更改。

在用户输入时如何用微笑将文本替换为文本的任何建议?

2 个答案:

答案 0 :(得分:1)

我之前已经实现了这样的类(封闭源代码,否则我会分享)。当用户点击退格时,棘手的部分是管理插入符号的位置 - 因此您需要将Smiley转换回:-,同时处理边缘情况(段落的开头/结尾,文档等)< / p>

答案 1 :(得分:0)

如果你得到插入符号位置,你可以在文本改变时查找克拉周围的字符(前3个和后3个)。