2017-06-30 17 views
-1

独自のWPFウィンドウにフロードキュメントテーブルの内容を表示したいと思います。ウィンドウは、すべてのテーブルの内容を表示することができますが、大きくはできません。WPFウィンドウのサイズをフロードキュメントテーブルに合わせる方法

ウィンドウのSizeToContentプロパティを "WidthAndHeight"に設定すると、ウィンドウの高さはテーブルと同じになりますが、ウィンドウの幅はモニタのサイズと同じくらい大きくなります。ウィンドウ幅は、テーブルと同じ幅であるが、表には、ウィンドウに一致するように伸ばしてしまったし、すべてのテーブルの列が広すぎる:でも私は、各セット

Table

さらに、すべての列が、同じ幅を持っています列の幅をGridLength.Autoに設定します。これは役に立ちません。なぜなら、ウィンドウを小さくすると、いくつかの列が単語の折り返しを開始し、他の列はまだ大きすぎます。目標は、各列が実際に必要なだけのスペースを使用することです。

私は逆を達成する必要があります:テーブルの列は、その中のテキストと同じ幅でなければならず、ウィンドウはすべての列のサイズと同じ大きさでなければなりません。ここで

は私のコードです:

<Window x:Class="TryFlowTable.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" SizeToContent="WidthAndHeight"> 
    <FlowDocumentScrollViewer Name="FlowDocumentViewer"/> 
</Window> 

C#

using System.Windows; 
using System.Windows.Documents; 
using System.Windows.Media; 

namespace TryFlowTable { 

    public partial class MainWindow: Window { 
    public MainWindow() { 
     InitializeComponent(); 

     var flowDocument = new FlowDocument(); 
     flowDocument.PagePadding = new Thickness(0); 
     FlowDocumentViewer.Document = flowDocument; 
     var mainTable = new Table(); 
     mainTable.CellSpacing = 0; 
     flowDocument.Blocks.Add(mainTable); 
     mainTable.Columns.Add(new TableColumn { Width=GridLength.Auto}); 
     mainTable.Columns.Add(new TableColumn { Width=GridLength.Auto }); 
     mainTable.Columns.Add(new TableColumn { Width=GridLength.Auto }); 
     var mainTableRowGroup = new TableRowGroup(); 
     mainTable.RowGroups.Add(mainTableRowGroup); 
     var firstRow = new TableRow(); 
     mainTableRowGroup.Rows.Add(firstRow); 
     addCell(firstRow, "First top line left", topLeft); 
     addCell(firstRow, "Top middle", topRight); 
     addCell(firstRow, "First top line right", topRight); 
     var middleRow = new TableRow(); 
     mainTableRowGroup.Rows.Add(middleRow); 
     addCell(middleRow, "Left", left); 
     addCell(middleRow, "Middle", right); 
     addCell(middleRow, "Right", right); 
    } 

    const int topLeft = 1; 
    const int topRight = 2; 
    const int left = 3; 
    const int right = 4; 

    private void addCell(TableRow tableRow, string text, int position) { 
     var run = new Run(text); 
     var tableCell = new TableCell(new Paragraph(run)); 
     tableCell.BorderBrush = Brushes.Gray; 
     if (position == topLeft) { 
     tableCell.BorderThickness = new Thickness(1, 1, 1, 1); 
     } else if (position == topRight) { 
     tableCell.BorderThickness = new Thickness(0, 1, 1, 1); 
     } else if (position == left) { 
     tableCell.BorderThickness = new Thickness(1, 0, 1, 1); 
     } else if (position == right) { 
     tableCell.BorderThickness = new Thickness(0, 0, 1, 1); 
     } 
     tableRow.Cells.Add(tableCell); 
    } 
    } 
} 

質問

(テーブルの内容は実行時に作成されるので、ないXAML)ソリューションの背後にあるコードを提案してください。フロードキュメントを使用します。ここでは、カラムはそのコンテンツに必要なスペースのみをとり、ウィンドウはタブレットと同じ幅になりますe。簡単に質問を読んだ後、重複としてそれらをマークすることによって、問題を適切に議論することを防ぐのstackoverflow上の何人かの人々があります

を複製するような質問をマークするために抵抗することができない人へ

。これはむしろイライラします。そうする前に、他の解決策がテーブルに関するものなのかどうか、慎重に検討してください。この質問は、ウィンドウ幅とテーブル幅を一致させることについて明示的に述べられており、完全なコードビハインドを提供する必要があります。

答えて

1

また、特定のセルを追加する列のインデックスを渡すことができる場合は、この解決策を実行することもできます。

//Global 
    long[] sizes = new long[3]{0,0,0}; 
//Function Call with column index as second parameter 
        addCell(firstRow,0, "First top line left", topLeft); 

//Function 
        private void addCell(TableRow tableRow,int column, string text, int position) 
        { 
         Size measure = TextRenderer.MeasureText(text, SystemFonts.DefaultFont); 
         if (measure.Width > sizes[column]) 
         { 

          sizes[column] = measure.Width; 
          mainTable.Columns[column].Width = new System.Windows.GridLength(measure.Width); 
         } 
         var run = new Run(text); 
         var tableCell = new TableCell(new Paragraph(run)); 
         tableCell.BorderBrush = Brushes.Gray; 
         if (position == topLeft) 
         { 
          tableCell.BorderThickness = new Thickness(1, 1, 1, 1); 
         } 
         else if (position == topRight) 
         { 
          tableCell.BorderThickness = new Thickness(0, 1, 1, 1); 
         } 
         else if (position == left) 
         { 
          tableCell.BorderThickness = new Thickness(1, 0, 1, 1); 
         } 
         else if (position == right) 
         { 
          tableCell.BorderThickness = new Thickness(0, 0, 1, 1); 
         } 
         tableRow.Cells.Add(tableCell); 
        } 
       } 

あなたが実際に使用しているフォントを使用するようにのmeasureText()関数を編集する必要があります。

+0

[wpf flowdocument table autofit option](https://stackoverflow.com/questions/1491285/wpf-flowdocument-table-autofit-option)には、測定と設定の列幅を明示するより詳細なコードがあります。しかし、カラム幅を固定値に設定したくないのは、これが他の機能を損なうからです。とにかく、私はテーブルの列の幅をautoに設定しました。 WPFの他の場所では、これはコンテンツのサイズに合わせる必要があることを意味します。私は何か間違っているのですか?自動車はどのように正しく使用されていますか? –

関連する問題