4

RichTextBox のコンテンツの高さを取得しようとしていますが、500px を超える場合は、最大高さが 500px の複数の RichTextBoxes に分割します。

誰でもこれを行う方法を知っていますか? ありがとう。

編集:

「分割」とは、高さの制限を超えるコンテンツを別の RichTextBox に配置することを意味します。ソリューションは、プロジェクトの特性により、現在の RichTextBox の外観を変更することはできません。

4

5 に答える 5

3

私はこの分割RichTextBoxの問題で少し遊んだのですが、それは簡単ではありません^^私の考えはこれでしょう:

  • RichTextBoxを継承するSplitRichTextBoxCustomControlを作成します(主にすべての依存関係プロパティを取得するため)
  • MaxContentHeight二重依存関係プロパティを追加して、最大サイズ(この場合は500px)を管理します
  • Remainders IList <RichTextBox>依存関係プロパティを追加します。これは、分割された後の現在のSplitRichTextBoxの残りの部分になります。
  • SplitRichTextBoxのControlTemplateをカスタマイズして、SplitRichTextBoxのコンテンツと残りを、レイアウトのニーズに合うパネルに表示します。
  • SplitRichTextBoxのOnTextChangedメソッドをオーバーライドします。

このメソッドでは、基になる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ではないことです。ドキュメントを分割する方法を取得するには、何らかの方法でページネーター/ページからデータを抽出する必要があります。ここで立ち止まり、行く道ではないかもしれませんが、試してみる価値はあると思います。

幸運を !

于 2012-11-08T08:58:46.833 に答える
1

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 呼び出しの使用に興味がある場合は、ここを参照してください。

于 2012-11-06T10:09:24.847 に答える
1

私はあなたの答えを得たと思います..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 でドキュメント (単一) を見ることができます。

于 2012-11-08T07:17:13.727 に答える
1

別の 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)したりできます。

于 2012-11-08T09:21:18.290 に答える
-1
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

于 2013-01-22T20:54:53.487 に答える