固定幅フォントの大きさに応じてWPFのRichTextBoxの幅と高さを設定します
-
24-09-2019 - |
質問
私は正確に特定の固定幅フォントで文字のグリッドに対応するために、WPFの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;
解決
あなたはその中にちょうど標準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
とBorderThickness
問題に遭遇してきたが、私はちょうど余分な2.を見つけることができませんそれはちょうどあなたがで立ち往生している一定のかもしれませんが、私はそれを疑います。それはどこかにあるはずだ。
StandardizationLine
を生産上の小さなヒントは、あなたが行うことができます。
string StandardizationLine = new string('X', columns);
ループをクリーンアップします。
他のヒント
私はリッチテキストボックスの高さの問題のための解決策を見つけた..私は一般的な使用のためにそれ変更した..
の の
....あなたのアプリケーションで次の構造体を作成します。[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形式の文字列を送っていないようにしてくださいあなたはあなたの要件に応じて、ワードラップで遊ぶことができます...