Вот сделка: у меня есть элемент управления RichTextBox, и он отлично работает. Проблема в том, что есть кнопка «Вставить текущее время даты», которая добавляет / вставляет текущее время и дату в RichTextBox. Пользователь может ввести дату и время в любом месте, куда указывает курсор. Это включает в себя сложные манипуляции со строками и прочее.
Любые идеи, как получить текущую позицию каретки. Всякий раз, когда я получаю RichTextBox.CaretPositon, кажется, что он указывает на начало RichTextBox, а не там, где находится фактическая каретка.
ОБНОВЛЕНИЕ 1:
Код нажатия кнопки даты и времени:
private void DateTimeStampButton_Click(object sender, RoutedEventArgs e)
{
//TextRange tr = new TextRange(textBox.Selection.Start, textBox.Selection.End);
var tr = new TextRange(textBox.Document.ContentStart, textBox.Document.ContentEnd);
if(tr.Text.Length == 2)
{
if(tr.Text == "\r\n")
{
tr.Text = tr.Text.TrimStart(new[] { '\r', '\n' });
}
}
textBox.CaretPosition.InsertTextInRun(DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString() + ": ");
DateTimeStampButton.Focusable = false;
}
private void SharpRichTextBox_LostFocus(object sender, RoutedEventArgs e)
{
SetValue(TextProperty, Text);
var binding = BindingOperations.GetBinding(this, TextProperty);
if (binding == null) return;
if (binding.UpdateSourceTrigger == UpdateSourceTrigger.Default || binding.UpdateSourceTrigger == UpdateSourceTrigger.LostFocus)
{
// if (TextProperty != null) BindingOperations.GetBindingExpression(this, TextProperty).UpdateSource();
}
}
public string Text
{
get
{
var newValue = new TextRange(Document.ContentStart, Document.ContentEnd).Text.RemoveNewLineAndReturn();
return newValue;
}
set
{
if (!String.IsNullOrEmpty(value))
{
SetValue(TextProperty, value.RemoveNewLineAndReturn());
Document.Blocks.Clear();
Document.Blocks.Add(new Paragraph(new Run(value)));
OnPropertyChanged("Text");
}
}
}
ОБНОВЛЕНИЕ 2:
Оказалось, проблема в том, что кнопка DateTime фокусируема. Я повернул его, чтобы он не фокусировался, и он работал как ожидалось. Когда фокус был потерян на RichTextBox, он сбрасывал позицию каретки. Это произошло только один раз, поскольку в коде btn_DateTime динамически устанавливалось как Focusable = false. Я поместил Focusable = false в XAML, и с самого начала все работало нормально.