1

正如标题所示,我的目标是增加/减少 RichTextBox 中当前选择的文本的字体大小。

这可能看起来微不足道,实际上它是 - 只要 TextRange 中所有文本的字体大小相同。当所选内容包含不同字体大小的文本时,

range.GetPropertyValue(TextElement.FontSizeProperty);

我用来获取字体大小的先前值(为了知道将值设置为什么是必要的)返回 DependencyProperty.UnsetValue 。

这不仅是一个问题,而且没有一种方法可以增加大小,只有一种方法可以显式地将其设置为给定值,这也是一个问题。

我考虑过尝试解析具有不同属性值的子范围的 TextRange,但这似乎是一种非常复杂的方式来实现应该是微不足道的事情。

我该怎么做?提前致谢。

4

4 回答 4

1

我认为任何实现,如果存在的话,最终都必须做你建议的完全相同的事情,所以你的选择是有限的:

如果您担心这是很多操作,那么您可能是对的,我能想到的唯一概念上的捷径就是应用 ScaleTransform。当然,这只会让它看起来有效,不会改变选择的属性。

如果您担心用户代码中有很多混乱,那么您也是对的,但我建议您通过制作自己的 RichTextBox 并自己实现 IncrementSizeOfSelection 和 DecrementSizeOfSelection 来隐藏它。

于 2013-09-04T16:01:35.357 回答
1

我认为这现在应该可以工作了......正如我在上一篇文章中所评论的那样,当它们的 textsize 变得相同时,这会处理 <run> 元素的自动合并:

    private void sizeTextSel(int iVal)
    {
        TextSelection ts = _richTextBox.Selection;
        TextPointer tpStart = ts.Start;
        TextPointer tpEnd = ts.End;
        TextPointer tpRun = tpStart;

        int iSelLength = ts.Text.Length;
        int iStartRunLength;
        object fontSizeSelection;
        int iTotalSelected = 0, iSelect = 0,iNew=0;
        do
        {
            iStartRunLength = tpRun.GetTextRunLength(LogicalDirection.Forward);
            iSelect = iStartRunLength < iSelLength - iTotalSelected ? iStartRunLength : iSelLength - iTotalSelected;
            if (iStartRunLength > 0)
            {
                iSelect = iSelect == 0 ? 1 : iSelect;
                ts.Select(tpRun, tpRun.GetPositionAtOffset(iSelect, LogicalDirection.Forward));
                fontSizeSelection = ts.GetPropertyValue(TextElement.FontSizeProperty);
                if (fontSizeSelection != null)
                    ts.ApplyPropertyValue(TextElement.FontSizeProperty, (double)fontSizeSelection + iVal);
                iNew = tpRun.GetTextRunLength(LogicalDirection.Forward);
                if (iNew==0)
                    tpRun = tpRun.GetPositionAtOffset(iSelect + 1, LogicalDirection.Forward);
                else
                    tpRun = tpRun.GetPositionAtOffset(iSelect, LogicalDirection.Forward);
            }
            else
            {
                if (tpRun.Parent.GetType() == typeof(FlowDocument))
                    iSelect = 2;
                else
                    iSelect = 0;
                tpRun = tpRun.GetPositionAtOffset(1, LogicalDirection.Forward);
            }

            iTotalSelected += iSelect;

        } while (tpRun != null && iTotalSelected < iSelLength);

        ts.Select(tpStart, tpEnd);
    }
于 2015-09-15T22:38:22.197 回答
0

通过 RichTextBox 的选择获取 TextRange,这将为您提供 TextRange,并且您的字体大小有一个 double 值。尝试这个

 public void SetFontSizeForSelection(TextRange selection, double newFontSize)
        {
            if ((newFontSize - 0) < double.Epsilon)
                newFontSize = 1;
            selection.ApplyPropertyValue(TextElement.FontSizeProperty, newFontSize);
        }
于 2013-09-04T19:15:04.757 回答
0

我认为必要的操作不会太多。我已经尝试过使用多种不同的文本大小- 此示例仅在所选文本包含在 < RUN > 元素中时才有效。但是应该可以为<span>之类的不同元素扩展代码但是,我不知道如何处理<Paragraph><Bold>Bolded</Bold></Paragraph>之类的东西

    private void sizeTextSel(int iVal)
    {
        TextSelection ts = _richTextBox.Selection;
        TextPointer tpStart = ts.Start;
        TextPointer tpEnd = ts.End;
        TextPointer tpRun = tpStart;

        int iSelLength = tpStart.GetOffsetToPosition(tpEnd);
        int iStartRunLength;
        object fontSizeSelection;
        int iTotalSelected = 0,iSelect;

        do
        {                   
            iStartRunLength = tpRun.GetTextRunLength(LogicalDirection.Forward);
            iSelect = iStartRunLength < iSelLength - iTotalSelected ? iStartRunLength : iSelLength - iTotalSelected;
            ts.Select(tpRun, tpRun.GetPositionAtOffset(iSelect,LogicalDirection.Forward));
            fontSizeSelection = ts.GetPropertyValue(TextElement.FontSizeProperty);
            if (fontSizeSelection != null)
                ts.ApplyPropertyValue(TextElement.FontSizeProperty, (double)fontSizeSelection + iVal);

            tpRun = tpRun.GetPositionAtOffset(iSelect + 1);
            while (tpRun != null && tpRun.Parent.GetType() != typeof(Run))
            {
                tpRun = tpRun.GetPositionAtOffset(1);
                //iOffset +=1;
            }
            iTotalSelected += iSelect+1;

        } while (tpRun != null && iTotalSelected < iSelLength);

        ts.Select(tpStart, tpEnd);
    }
于 2015-09-14T14:03:35.067 回答