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