Преобразование текста в текст с улыбками во время набора текста пользователем - PullRequest
0 голосов
/ 07 января 2011

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

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

Например: Hello world :) -> Hello world IMAGE_SMILE

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

Вот оно:

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

В приложении WPF я связываю свойства со свойствами «Текст» и «Документ» элемента управления 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 все еще меняется.

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

Ответы [ 2 ]

1 голос
/ 20 января 2011

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

0 голосов
/ 07 января 2011

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

...