【问题标题】:WPF RichTextBox - Selected Block?WPF RichTextBox - 选定的块?
【发布时间】:2020-06-22 17:15:45
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# wpf richtextbox


    【解决方案1】:
    var curCaret = richTextBox1.CaretPosition;
    var curBlock = richTextBox1.Document.Blocks.Where(x => x.ContentStart.CompareTo(curCaret) == -1 && x.ContentEnd.CompareTo(curCaret) == 1).FirstOrDefault();
    

    【讨论】:

    • 谢谢马特。正是我想要的。
    【解决方案2】:

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

    类似这样的:

    • 设置 TextSelectionChanged 事件处理程序
    • 获取 TextSelection 指针并找到 Start TextPointer
    • 抓取 TextSelection.Start.Parent 项
    • 判断是否属于段落类型
    • 解析 Paragraph.Inlines
    • 查找需要相应转换的 InlineUIContainer 类型。

    【讨论】:

    • 谢谢。我不再使用 WPF。我最终意识到有太多这样的箍要跳过,所以我又回到了 WinForms...
    【解决方案3】:

    在 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);
    }
    

    【讨论】:

      【解决方案4】:
      Paragraph currentParagraph = richTextBox1.CaretPosition.Paragraph;
      

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

      MS Docs:

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

      【讨论】:

        猜你喜欢
        • 2010-10-13
        • 2015-06-05
        • 1970-01-01
        • 2010-09-25
        • 2014-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多