WPF RichTextBox - 选定块?

时间:2010-03-31 13:05:01

标签: c# wpf richtextbox

我正在尝试使用WPF RichTextBox,并注意到我可以通过循环遍历RichTextBox.Document.Blocks来遍历构成其文档的块。

获取插入符号周围的块的最佳方法是什么?

我可以获得每个块的CaretPosition和ElementStart以及ElementEnd属性,但无法看到如何比较它们,因为实际的字符偏移不会暴露,除非我遗漏了一些明显的东西。

4 个答案:

答案 0 :(得分:8)

var curCaret = richTextBox1.CaretPosition;
var curBlock = richTextBox1.Document.Blocks.Where(x => x.ContentStart.CompareTo(curCaret) == -1 && x.ContentEnd.CompareTo(curCaret) == 1).FirstOrDefault();

答案 1 :(得分:1)

上面的答案可能适用于WPF RTB但不适用于Silverlight 4.0。 SL很可能不允许访问RTB的Document protion。所以你必须通过反思来做到这一点....

这样的事情:

  • 设置TextSelectionChanged事件处理程序
  • 抓住TextSelection指针并找到Start TextPointer
  • 抓住TextSelection.Start.Parent项目
  • 查明它是否为段落
  • 解析Paragraph.Inlines
  • 寻找InlineUIContainer的类型,你需要相应地投射它。

答案 2 :(得分:0)

在Silverlight5中获取用于更新工具栏的属性:

private void rtb_SelectionChanged(object sender, RoutedEventArgs e)
{
    TextSelection ts = rtb.Selection;
    object property;

    property =  ts.GetPropertyValue(Run.FontWeightProperty);
    System.Windows.FontWeight fontWeight = property is System.Windows.FontWeight ? (FontWeight)property : FontWeights.Normal;

    property = ts.GetPropertyValue(Run.FontStyleProperty);
    System.Windows.FontStyle fontStyle = property is System.Windows.FontStyle ? (FontStyle)property : FontStyles.Normal;

    TextDecorationCollection textDecorations = ts.GetPropertyValue(Run.TextDecorationsProperty) as TextDecorationCollection;
    bool isUnderlined = textDecorations != null;

    double? fontSize = ts.GetPropertyValue(Run.FontSizeProperty) as double?;
    SolidColorBrush foreground = ts.GetPropertyValue(Run.ForegroundProperty) as SolidColorBrush;
    Color foregroundColor = foreground != null ? foreground.Color : Colors.Black;

    System.Diagnostics.Debug.WriteLine("fontweight:{0}, fontStyle:{1}, Underline:{2}, size:{3}, color:{4}", 
        fontWeight,
        fontStyle,
        isUnderlined,
        fontSize, 
        foregroundColor);

    if (fontSize.HasValue)
        SetToolbarFontSize(fontSize.Value);

    SetToolbarFontColor(foregroundColor);
}

答案 3 :(得分:0)

Paragraph currentParagraph = richTextBox1.CaretPosition.Paragraph;

此代码将返回一个Paragaph对象而不是Block对象,但是由于RichTextBox中的块通常是段落,因此不会造成任何问题。

MS Docs:

Blocks属性是RichTextBox的content属性。它是段落元素的集合。