RichTextBox のコンテンツの高さを取得しようとしていますが、500px を超える場合は、最大高さが 500px の複数の RichTextBoxes に分割します。
誰でもこれを行う方法を知っていますか? ありがとう。
編集:
「分割」とは、高さの制限を超えるコンテンツを別の RichTextBox に配置することを意味します。ソリューションは、プロジェクトの特性により、現在の RichTextBox の外観を変更することはできません。
私はこの分割RichTextBoxの問題で少し遊んだのですが、それは簡単ではありません^^私の考えはこれでしょう:
このメソッドでは、基になるrichTextBox flowDocumentを取得し、ページネーターを取得します。MaxPageHeightを設定し、ドキュメントページを計算します。
var flowDocument = this.Document;
flowDocument.MaxPageHeight = this.MaxContentHeight;
DocumentPaginator paginator = ((IDocumentPaginatorSource)flowDocument).DocumentPaginator;
paginator.ComputePageCount();
これで、ページネーターのGetPage(int i)メソッドのおかげで、各ページのコンテンツを取得できるようになります。最初のページは、最初のRichTextBoxに必要なものです。残りのページは、Remainders依存関係プロパティをインスタンス化するために使用されます。
問題は、ページが直接RTFまたはflowDocumentではないことです。ドキュメントを分割する方法を取得するには、何らかの方法でページネーター/ページからデータを抽出する必要があります。ここで立ち止まり、行く道ではないかもしれませんが、試してみる価値はあると思います。
幸運を !
RichTextBox.ContentsResized イベントでこのコードを使用してみましたか。
Private Sub rtb_ContentsResized(ByVal sender As Object, ByVal e As System.Windows.Forms.ContentsResizedEventArgs) Handles txtQuestion.ContentsResized
Dim h = e.NewRectangle.Height, w = e.NewRectangle.Width
h = Math.Max(h, sender.Font.Height)
h = Math.Min(h, Me.ClientSize.Height - 10 - sender.Top)
h += sender.Height - sender.ClientSize.Height + 1
sender.Height = h
サブ終了
これに代わる C# コードがあるかどうかはわかりません。
また、追加情報 - Richtextbox コントロールは GDI を使用して描画されますが、'Graphics.MeasureString' は GDI+ を使用して文字列を測定します。したがって、'MeasureString' は文字列の正確なサイズを返しません。正確な結果を得るには、GDI32-API を掘り下げる必要があると思います。Win32 GDI API 呼び出しの使用に興味がある場合は、ここを参照してください。
私はあなたの答えを得たと思います..Googleとstackoverflowに感謝します。
WPF FlowDocument は、1 つの RichTextBox にのみ属することができます。しかし、UI の異なるポイントで操作できる 1 つのドキュメントを使用している場合、1 つのドキュメントを同時に表示する 2 つの RichTextBox が存在することはありません (WPF が文句を言うため、できません)。しかし、使用しているドキュメントは 1 つですか、それとも複数ですか? 独身の場合は残りを読み、そうでない場合は先に進んでください。
MemoryStream と XamlReader/Writer の使用は、ここでは機能しません。単一のドキュメントを保持し、それが使用されるたびに変更を反映する必要があるため、毎回コピーすることはできません。stackoverflow のメンバー Jared からコピーされた、
WPF コントロールは自由に「親を解除」および「親を変更」できるため、ウィザード全体で共有されるコンテキストで RichTextBox インスタンスを使用できるようにし、ページからページに移動するときに必ず親を解除/再親するようにしてください。これには、ウィザードのページ全体でエディターの状態に対するスタイルや変更を保存するという利点もあります (これはおそらく望ましいことです)。
ページ間で RichTextBox インスタンスを共有できない場合は、ドキュメントと元の RichTextBox の関連付けを解除する方法があると思います。ドキュメントと RichTextBox1 の関連付けを解除するには、RichTextBox1 に新しいドキュメントを提供する必要があるようです。RichTextBox1.Document を null に設定することはできませんが、RichTextBox1.Document を new FlowDocument() に設定することはできます。これでうまくいくと思います。
上記のことから、FlowDocument は複数の RichTextBox コントロールで直接共有することはできません。上のコメントのように、グリッドを使用します。
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
RTB をラップし、コード ビハインドで使用する
FlowDocument doc = RTB1.Document;
RTB1.Document = new FlowDocument();
RTB2.Document = doc;
これがコントロールを分割するかどうかはわかりませんが、別の RTB でドキュメント (単一) を見ることができます。
別の RichTextBox の高さ制限を超えるコンテンツを取得するには、次のアプローチを使用します。
private TextRange GetTopRange()
{
var result = textBox.GetPositionFromPoint(new Point(0, 0), true);
if (result == null)
return null;
result = result.GetInsertionPosition(LogicalDirection.Forward);
return new TextRange(result.DocumentStart, result);
}
private TextRange GetBottomRange()
{
var result = textBox.GetPositionFromPoint(new Point(textBox.ActualWidth, textBox.ActualHeight), true);
if (result == null)
return null;
result = result.GetInsertionPosition(LogicalDirection.Backward);
return new TextRange(result, result.DocumentEnd);
}
テキスト範囲があれば、それらを別の RichTextBox の新しい FlowDocument にコピーしたり、切り捨てたり ( range.Text = string.Empty
)したりできます。
public void CreateNewRtb(object sender, RoutedEventArgs routedEventArgs)
{
var res = (ResourceDictionary)Application.LoadComponent(new Uri("/Design/Style/TextAreaStyle.xaml", UriKind.Relative));
var mcRtb = new RichTextBox {Style = (Style) res["TextBoxStyle"], Name = "Folha" + J};
RegisterName("Folha" + J, mcRtb);
mcRtb.TextChanged += McRtbContentControl;
var gcrd = new RowDefinition();
var gcrdspace = new RowDefinition();
gcrd.Height = new GridLength(980);
GridControl.RowDefinitions.Add(gcrd);
Grid.SetColumn(mcRtb, 1);
Grid.SetRow(mcRtb, 1 + I);
GridControl.Children.Add(mcRtb);
I += 2;
J++;
gcrdspace.Height = new GridLength(30);
GridControl.RowDefinitions.Add(gcrdspace);
mcRtb.Focus();
}
これは、三日月グリッドのサイズを制御し、自由に rtb を作成する簡単な方法です:D