2

私は C# と VS2008 で作業しています。

FlowDocument を含む WPF アプリケーションがあります。これには、多数のかなり短い行 (つまり、Spans と LineBreaks) を含む段落が含まれています。ただし、線の長さは異なります。FlowDocument の幅は、折り返しなしでこれらの行の中で最も長い行を収容するのに十分な大きさにする必要がありますが、スペースを無駄にしないように幅を広げないようにしたいと考えています。

Width=Auto を使用してグリッド列に配置しても機能しません。FlowDocument はさまざまな幅に合わせて有効に折り返すことができるため、FlowDocument は常に許可されている最大幅を消費します。

コードで行を生成しながら行を調べ、それぞれの幅を計算することはできますが、Span または Run クラスに Width プロパティが表示されません。

このドキュメントの幅を自動または手動で設定する方法についてのアイデアはありますか?


AndrewS の提案したアイデアを使用して、FlowDocument から、それぞれが行を含むラベルの StackPanel に移動しました。XAML マークアップは

<Border BorderThickness="2" Margin="2" BorderBrush="Black">
    <ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">
        <StackPanel 
         Orientation="Vertical"
            x:Name="itemsStackPanel" />
    </ScrollViewer>
</Border>

コードはスパンを作成し、次のように追加します。

        Label itemLabel = new Label();
        // pad left and right, keep close top and bottom
        itemLabel.Padding = new Thickness(2,0,2,0);
        itemLabel.Content = contentSpan;
        this.itemsStackPanel.Children.Add(itemLabel);

サイジングは今では完璧です。唯一の問題は、フォント ファミリーとフォント サイズが同じ (Segoe UI、15pt) であるにもかかわらず、フォントが隣の FlowDocument とまったく同じに見えないことと、ラベルがよく見えることです。 FlowDocument の行よりも離れています。別の質問としてこれを尋ねました

4

2 に答える 2

1

同様の状況がありますが、線幅を測定したいです。悲しいことに、RichTextBox には 2 つの重要な機能がバンドルされています。ランと書式設定におけるテキストの前景色と背景色です。色が必要で、フォーマットはあまり気にしません。文字の「グリッド」があり、文字に対していくつかの「カーソル」を実行したいと考えています。背景色を個々のカーソルとして実装し、前景色を構文の色分けに使用する予定です。これは固定幅のフォントであり、グリッドを折り返したくないので、基本的に書式設定はありません。テキストの大きさに応じて実行時に行と列を設定するグリッドとしてこれを実装できると思いますが、それはリソースの実際の浪費のように思えます-特にファイルが本当に大きい場合-つまり、すべてのセルに個別のラベルが付いた 100x100 グリッド。もともと、そしておそらく少し素朴に、RichTextBox を使えば簡単にできると思っていましたが、そうではないと信じ始めています。もう1つの可能性は、キャンバスを標準のTextBoxの上に置き、長方形を自分で描画することですが、スクロールなどのすべてを処理する必要があります。見た目が悪く、エラーが発生しやすくなります。現在の私のコードは次のとおりです。

    private static void SetRichText(RichTextBox rtb, string[] arLines)
    {
        Contract.Assert(arLines.All(l => l.Length == arLines[0].Length));
        FlowDocument doc = new FlowDocument { PageWidth = 65535.0 };

        IEnumerable<Paragraph> iep = arLines.Select(l =>
                                            {
                                                Paragraph p = new Paragraph();
                                                p.Inlines.Add(new Run(l));
                                                return p;
                                            });
        foreach (Paragraph p in iep)
        {
            doc.Blocks.Add(p);
        }

        rtb.Document = doc;
        doc.PagePadding = new Thickness(0, 0, 0, 0);

        Rect rcEOL = rtb.Document.ContentStart.GetPositionAtOffset(arLines[0].Length).GetCharacterRect(LogicalDirection.Forward);
        // TODO : Figure why I have to add a fudge factor in the following (I'm guessing some margin I'm unaware of in the 
        // RichTextBox somewhere)...
        rtb.Document.PageWidth = rcEOL.Right + 18;
    }

コメントで述べているように、これは私の現在のケースでは機能しているようですが、他の多くのケースで実際にテストしていないため、一般的に機能するかどうかはわかりません。説明できないので、これを正しく処理する方法を知りたいです。返信ありがとうございます。ああ、上で述べたように、 for は固定ピッチであり、すべての着信文字列は契約によって強制されるのと同じ長さであるため、すべての行はまったく同じ長さでなければならないことを指摘しておく必要があります。

于 2010-01-03T09:46:48.420 に答える
1

行を TextBlocks や Labels (折り返しを制御できる)、または「固定形式のドキュメントのプレゼンテーションおよび印刷シナリオ用に設計された」グリフなどの別のタイプの要素に置き換えることができます。

線を測定してドキュメントの幅を強制しようとは思わないでしょう。

于 2009-05-13T13:14:22.923 に答える