检测 RichTextBox 中插入符号位置何时更改

Posted

技术标签:

【中文标题】检测 RichTextBox 中插入符号位置何时更改【英文标题】:Detect when caret position changes in RichTextBox 【发布时间】:2014-08-04 08:02:12 【问题描述】:

我正在尝试为 WPF 中的 RichTextBox 实现非常简单的文本格式化功能。这仅由 RichTextBox 上方的几个粗体、斜体等 ToggleButtons 组成。见下图,但忽略顶部的 TextBox - RichTextBox 是底部较大的。

在选择或插入符号位置(对于将要输入的文本)切换格式不是问题,因为我正在这样做:

    private void BoldButton_Checked(object sender, RoutedEventArgs e)
    
        this.SetSelectionBold(true);
    

    private void BoldButton_Unchecked(object sender, RoutedEventArgs e)
    
        this.SetSelectionBold(false);
    

    private void SetSelectionBold(bool isBold)
    
        var selection = this.RichText.Selection;
        if (selection != null)
        
            selection.ApplyPropertyValue(TextElement.FontWeightProperty, isBold ? FontWeights.Bold : FontWeights.Normal);
        
    

但是,如果用户将插入符号移动到其他位置(例如,从粗体文本到普通文本),那么我希望 ToggleButtons 能够反映该状态,其方式与在 Word 中的工作方式大致相同。是否可以检测插入符号位置何时发生变化并采取相应措施?

【问题讨论】:

【参考方案1】:

将自己连接到SelectionChanged 事件并获取当前插入符号位置,并测试该属性是否存在于该选择中?

在这种情况下,你可能想要这样的东西:

var selection = richTextBox.Selection;
if(selection != null)

  if(selection.GetPropertyValue(TextElement.FontWeightProperty) == FontWeights.Bold)
    // todo; enable your button

如果该事件不是由插入符号定位触发的(文档没有说明), 您可能需要从 RichTextBox 继承并覆盖OnSelectionChanged,之后您需要实际生成自己的插入符号,例如:

var currentCaretPlusOne = new TextRange(richTextBox.CaretPosition, 
                  richTextBox.CaretPosition+1);
if(currentCaretPlusOne != null)

   if(currentCaretPlusOne.GetPropertyValue(TextElement.FontWeightProperty)
             == FontWeights.Bold)
        // todo; enable your button

【讨论】:

第一种方法奏效了——没想到这么简单。只有一件事,您需要在调用 GetPropertyValue() 时强制转换为 FontWeight 以便您可以执行比较。

以上是关于检测 RichTextBox 中插入符号位置何时更改的主要内容,如果未能解决你的问题,请参考以下文章

如何在不选择 RichTextBox 的情况下恢复插入符号位置或更改文本颜色

RichTextBox C# 设置插入符号位置 winforms

WPF RichTextBox 将插入符号定位到具有给定索引的可见字符

C#中怎样让richTextBox控件的滚动条跟随数据向下移动!

C#中,如何让richTextBox旁边的滚动条始终处于最下方

C#中,richTextBox中,如何固定好插入进来图片的位置。固定死!!(比如一定要放在中间最上面,咋整呢)