检测RichTextBox中插入符号位置的变化

时间:2014-08-04 08:02:12

标签: wpf richtextbox text-formatting

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

enter image description here

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

    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 个答案:

答案 0 :(得分:4)

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

在这种情况下,您可能需要以下内容:

var selection = richTextBox.Selection;
if(selection != null)
{
  if(selection.GetPropertyValue(TextElement.FontWeightProperty) == FontWeights.Bold)
    // todo; enable your button
}

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

var currentCaretPlusOne = new TextRange(richTextBox.CaretPosition, 
                  richTextBox.CaretPosition+1);
if(currentCaretPlusOne != null)
{
   if(currentCaretPlusOne.GetPropertyValue(TextElement.FontWeightProperty)
             == FontWeights.Bold)
        // todo; enable your button
}