Я пытаюсь решить эту проблему. У меня есть привязываемые свойства 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 все еще изменяется.
Любые советы, как заменить текст на текст с улыбкой во время ввода пользователем?