4

特定の等幅フォントの文字のグリッドを正確に収容するために、WPF RichTextBox を適合させようとしています。現在、RichTextBox の幅と高さを決定するために FormattedText を使用していますが、提供される測定値が小さすぎます。具体的には、幅が 2 文字小さすぎます。

このタスクを実行するためのより良い方法はありますか? これは、コントロールのサイズを決定する適切な方法ではないようです。

RichTextBox rtb;
rtb = new RichTextBox();
FontFamily fontFamily = new FontFamily("Consolas");
double fontSize = 16;
char standardizationCharacter = 'X';
String standardizationLine = "";
for(long loop = 0; loop < columns; loop ++) {
    standardizationLine += standardizationCharacter;
}
standardizationLine += Environment.NewLine;
String standardizationString = "";
for(long loop = 0; loop < rows; loop ++) {
    standardizationString += standardizationLine;
}
Typeface typeface = new Typeface(fontFamily, FontStyles.Normal, FontWeights.Normal, FontStretches.Normal);
FormattedText formattedText = new FormattedText(standardizationString, CultureInfo.CurrentCulture, FlowDirection.LeftToRight, typeface, fontSize, Brushes.Black);
rtb.Width = formattedText.Width;
rtb.Height = formattedText.Height;
4

2 に答える 2

6

RichTextBox内部に標準のみを含む非常に基本的なものがあると仮定するとFlowDocument、余分なレイアウトの使用をすべて考慮する必要がありますRichTextBox

Document.PagePaddingプロパティのデフォルトは{5,0,5,0}です。したがって、幅に 10 を追加する必要があります。

さらに、RichTextBoxにはBorderThicknessデフォルトの があり{1, 1, 1, 1}ます。したがって、幅に 2 を追加する必要があります。

したがって、必要なコードは次のようになります。

var pagePadding = rtb.Document.PagePadding;
var borderThickness = rtb.BorderThickness;
rtb.Width = formattedText.Width
    + pagePadding.Left + pagePadding.Right 
    + borderThickness.Left + borderThickness.Right;

これを行うと、まだ 1 文字ずれますが、それは少し誤解を招く可能性があります。RichTextBoxテキストが文字幅全体ではなく、ほんの少し幅が広い場合でも、 は折り返されます。幅に 2 を追加すると、うまくいきます。その余分な2がどこから来ているのか正確にはわかりません。幅をそれほど正確にしようとしたことはありません。PagePadding以前にandの問題に遭遇したBorderThicknessことがありますが、余分な 2 が見つかりません。どこかにあるに違いない。

StandardizationLineあなたができることを生み出すための小さなヒント

string StandardizationLine = new string('X', columns);

ループをクリーンアップします。

于 2010-04-03T13:23:54.637 に答える
0

リッチ テキスト ボックスの高さの問題の解決策を見つけました..一般的な使用のために修正しました..

アプリケーションで次の構造体を作成します....

[StructLayout(LayoutKind.Sequential)]
    public struct RECT {
        public Int32 left;
        public Int32 top;
        public Int32 right;
        public Int32 bottom;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct SCROLLBARINFO {
        public Int32 cbSize;
        public RECT rcScrollBar;
        public Int32 dxyLineButton;
        public Int32 xyThumbTop;
        public Int32 xyThumbBottom;
        public Int32 reserved;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
        public Int32[] rgstate;
    }

フォームのクラスに次のプライベート変数を作成します (リッチ テキストの高さを計算する必要がある場合)。

private UInt32 SB_VERT = 1;
        private UInt32 OBJID_VSCROLL = 0xFFFFFFFB;

        [DllImport("user32.dll")]
        private static extern
            Int32 GetScrollRange(IntPtr hWnd, UInt32 nBar, out Int32 lpMinPos, out Int32 lpMaxPos);

        [DllImport("user32.dll")]
        private static extern
            Int32 GetScrollBarInfo(IntPtr hWnd, UInt32 idObject, ref SCROLLBARINFO psbi);

フォームのクラスに次のメソッドを追加します

private int CalculateRichTextHeight(string richText) {
            int height = 0;
            RichTextBox richTextBox = new RichTextBox();
            richTextBox.Rtf = richText;
            richTextBox.Height = this.Bounds.Height;
            richTextBox.Width = this.Bounds.Width;
            richTextBox.WordWrap = false;
            int nHeight = 0;
            int nMin = 0, nMax = 0;

            SCROLLBARINFO psbi = new SCROLLBARINFO();
            psbi.cbSize = Marshal.SizeOf(psbi);

            richTextBox.Height = 10;
            richTextBox.ScrollBars = RichTextBoxScrollBars.Vertical;

            int nResult = GetScrollBarInfo(richTextBox.Handle, OBJID_VSCROLL, ref psbi);
            if (psbi.rgstate[0] == 0) {
                GetScrollRange(richTextBox.Handle, SB_VERT, out nMin, out nMax);
                height = (nMax - nMin);
            }

            return height;
        }

上記のメソッドを変更して、要件に従って機能させる必要がある場合があります...通常のテキストではなく、Rtf文字列をパラメーターとしてメソッドに送信し、使用可能な幅と高さをメソッドのRichtextbox変数に割り当てるようにしてください.. .

要件に応じて WordWrap で遊ぶことができます...

于 2012-02-23T14:45:25.873 に答える