RichTextBox和插入位置

时间:2010-02-08 19:24:49

标签: wpf richtextbox

这是交易:我有一个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按钮是Focusable。我把它变得无法集中,它按预期工作。当焦点在RichTextBox上丢失时,它正在重置插入位置。它只发生一次,因为在代码中btn_DateTime被动态设置为Focusable = false。我在XAML中放置了Focusable = false,从一开始就一切正常。

3 个答案:

答案 0 :(得分:11)

我正在使用此代码成功完成您的尝试:

private void insertNowButton_Click(object sender, RoutedEventArgs e)
{
    //NOTE:  The caret position does not change.
    richTextBox1.CaretPosition.InsertTextInRun(DateTime.Now.ToString());
}

编辑:解决更新1

private void DateTimeStampButton_Click(object sender, RoutedEventArgs e)
{
    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' });
        }
    }

    /* Changing the text is the only way I can get the date to insert at the beginning */
    tr.Text = "I need a beer at ";

    textBox.CaretPosition.InsertTextInRun(DateTime.Now.ToString());
}

看起来SetValue正在更改文本,所以根据我的测试,实际更改文本重置插入符号,我同意你SetValue导致问题......

答案 1 :(得分:3)

我用WPFToolkit.Extended RichTextBox尝试了这个解决方案,它对我不起作用。 然而,我发现了另一个,并认为将其发布在这里是好的,以防其他人可以使用它。

我的问题还在于,在点击了一个应该在插入符号位置附加文本的按钮之后,它将其添加到RichTextBox的开头。

所以我找到的解决方案类似于这里的解决方案 -

RichTextBox CaretPosition physical location

我没有使用CaretPosition,而是使用了RichTextBox.Selection.Start.InsertTextInRun(“SomeText”)。

它认为选择的开始是插入位置,即使没有做出选择,因此对我来说已经足够了。

我希望有人会觉得这很有用:)

答案 2 :(得分:2)

这对我有用:

private void InsertText(String text, RichTextBox rtb)
{
    rtb.CaretPosition = rtb.CaretPosition.GetPositionAtOffset(0, LogicalDirection.Forward);
    rtb.CaretPosition.InsertTextInRun(text);
}

我在这里找到了代码:

How do I move the caret a certain number of positions in a WPF RichTextBox?