Преобразование текста в текст с помощью смайлов во время ввода пользователем

Я пытаюсь решить эту проблему. У меня есть привязываемые свойства richTextBox для свойств текста и документа, этот элемент управления получен из richTextBox из расширенного набора инструментов WPF.

Мой сценарий таков: пользователь набирает текст в richTextBox, если он написал текстовые смайлики, я хочу преобразовать эти текстовые смайлики в смайлики изображения и показать его в richTextBox.

Например: Привет, мир :) -> Привет, мир IMAGE_SMILE

У меня есть собственный класс, который преобразует строку со смайликами в тип абзаца с текстом и изображениями.

Вот оно:

public Paragraph ConvertToMessageWithEmoticons(string rpText){...}

В приложении WPF я привязываю свойства к свойствам Text и Document элемента управления richTextBox.

    //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 для .NET (Rx) и создаю Observer для свойства RtbText.

        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);
   }

Я пытаюсь проверить на смайликах только 3 последних символа RtbText, но если пользователь печатает, свойство RtbText все еще изменяется.

Любые советы, как заменить текст на текст с улыбкой во время ввода пользователем?


person Community    schedule 07.01.2011    source источник


Ответы (2)


Я реализовал подобные классы раньше (с закрытым исходным кодом, хотя в противном случае я бы поделился). Сложная часть заключается в управлении положением каретки, когда пользователь нажимает клавишу Backspace, потому что тогда вам нужно преобразовать смайлик обратно в :-, обрабатывая крайние случаи (начало/конец абзаца, документ и т. д.)

person Ana Betts    schedule 20.01.2011

Если вы получили положение каретки, вы можете искать символы вокруг каретки (предыдущие 3 и следующие 3) при изменении текста.

person dcarneiro    schedule 07.01.2011