1

タイトルが示すように、私の目的は、RichTextBox 内の現在選択されているテキストのフォント サイズをインクリメント/デクリメントすることです。

これはささいなことのように思えるかもしれませんが、実際には、TextRange 内のすべてのテキストのフォント サイズが同じである限り、そうです。選択範囲に異なるフォント サイズのテキストが含まれている場合、

range.GetPropertyValue(TextElement.FontSizeProperty);

フォントサイズの以前の値を取得するために使用します(値を設定するものを知るために必要です) DependencyProperty.UnsetValue を返します。

これが問題であるだけでなく、サイズをインクリメントする方法がなく、指定された値に明示的に設定する方法が 1 つだけあるという事実も、ここで問題を引き起こしています。

さまざまなプロパティ値を持つサブ範囲の TextRange を解析しようと考えましたが、これは些細なことを達成するための非常に複雑な方法のようです。

どうすればいいですか?前もって感謝します。

4

4 に答える 4

1

実装が存在する場合、最終的には提案したものとまったく同じことを行う必要があるため、選択肢は限られていると思います。

これが多くの操作であるという懸念がある場合は、それについて正しい可能性があり、私が考えることができる唯一の概念的なショートカットは、ScaleTransform を適用することです。もちろん、これは機能しているように見せるだけで、選択のプロパティを変更するものではありません。

これがユーザー コードの乱雑さであるという懸念がある場合は、その通りですが、独自の RichTextBox を作成し、IncrementSizeOfSelection と DecrementSizeOfSelection を自分で実装することで、それを隠すことをお勧めします。

于 2013-09-04T16:01:35.357 に答える
1

これでうまくいくと思います...前回の投稿でコメントしたように、これにより < run > 要素の textsize が同じになったときの自動マージが処理されます。

    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

TextRange を提供する RichTextBox の Selection を介して TextRange を取得すると、fontsize の値が 2 倍になります。これを試して

 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 に答える