2017-06-30 2 views
-1

Ich möchte den Inhalt einer Flussdokumenttabelle in einem eigenen WPF-Fenster anzeigen. Das Fenster sollte nur so groß sein, dass alle Tabelleninhalte angezeigt werden können, aber nicht größer.Wie passt man die Größe eines WPF-Fensters an eine Flussdokumenttabelle an?

Wenn ich die SizeToContent-Eigenschaft des Fensters auf "WidthAndHeight" festlege, stimmt die Höhe des Fensters genau mit der der Tabelle überein, aber die Fensterbreite wird so groß wie die Größe meines Monitors. Die Fensterbreite ist die gleiche Breite wie die Tabelle, aber der Tisch wurde gestreckt, um das Fenster zu passen und alle Tabellenspalten sind zu breit:

Table

Darüber hinaus können alle Spalten die gleiche Breite, auch stelle ich je Spaltenbreite zu GridLength.Auto. Das ist nicht hilfreich, denn wenn ich das Fenster verkleinere, beginnen einige Spalten mit dem Zeilenumbruch, während andere Spalten immer noch zu groß sind. Das Ziel ist, dass jede Spalte nur so viel Platz benötigt, wie wirklich benötigt wird.

Ich muss das Gegenteil erreichen: Die Tabellenspalten sollten nur so breit sein wie der Text darin und das Fenster sollte nur so groß wie alle Spalten zusammen sein.

Hier ist mein Code:

<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); 
    } 
    } 
} 

Frage

schlagen Sie bitte einen Code hinter Lösung (nicht XAML, weil der Tabelleninhalt während der Laufzeit erstellt wird) Verwenden eines Ablaufdokuments, wobei Spalten nur den Platz einnehmen, den ihr Inhalt benötigt, und wo das Fenster nur so breit ist wie das Tabl e.

Für diejenigen, die nicht widerstehen können Fragen markieren als Duplikate

einige Leute auf Stackoverflow Es gibt die verhindern, dass die Fragen richtig diskutiert werden können, indem man sie als Duplikate Markierung kurz auf die Frage nach dem Lesen. Das ist ziemlich frustrierend. Bevor Sie dies tun, überlegen Sie bitte sorgfältig, ob die andere Lösung nur Tabellen betrifft? Bei dieser Frage geht es explizit darum, die Fensterbreite an die Tabellenbreite anzupassen und den vollständigen Code dahinter zur Verfügung zu stellen.

Antwort

1

Wenn Sie auch einen Index der Spalte übergeben können, der Sie die bestimmte Zelle hinzufügen, ist diese Lösung möglicherweise machbar.

//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); 
        } 
       } 

Sie müssen vielleicht die measureText() Funktion bearbeiten Sie die Schriftart verwenden, die Sie tatsächlich verwenden.

+0

Es gibt einen detaillierteren Code, der explizit die Messung und Einstellung der Spaltenbreite zeigt: [wpf flowdocument table autofit option] (https://stackoverflow.com/questions/1491285/wpf-flowdocument-table-autofit-option). Aber ich mag es nicht, die Spaltenbreite auf einen festen Wert zu setzen, da dies andere Funktionen beeinträchtigt. Und trotzdem habe ich die Tabellenspaltenbreite auf auto eingestellt. Überall sonst in WPF bedeutet dies, dass die Größe dem Inhalt entsprechen sollte. Mache ich etwas falsch ? Wie wird das Auto richtig verwendet? –

Verwandte Themen