2017-06-30 3 views
-1

Je souhaite afficher le contenu d'une table de document de flux dans sa propre fenêtre WPF. La fenêtre devrait être aussi grande que tout le contenu de la table peut être affiché, mais pas plus grand. Lorsque j'ai défini la propriété SizeToContent de la fenêtre sur "WidthAndHeight", la hauteur de la fenêtre est correctement la même que celle de la table, mais la largeur de la fenêtre est étirée aussi grande que la taille de mon moniteur. La largeur de la fenêtre est la même largeur que la table, mais la table se est étirée pour correspondre à la fenêtre et toutes les colonnes de table sont trop larges:Comment ajuster la taille d'une fenêtre WPF à une table de document de flux

Table

En outre, toutes les colonnes ont la même largeur, même que je mets chaque Largeur de la colonne à GridLength.Auto. Ce n'est pas utile, parce que quand je fais la fenêtre plus petite, certaines colonnes commencent à emballer le mot, alors que d'autres colonnes ont toujours trop de taille. Le but est que chaque colonne utilise seulement autant d'espace que nécessaire.

J'ai besoin de réaliser le contraire: Les colonnes de la table doivent être seulement aussi larges que le texte et la fenêtre ne devrait être aussi grande que toutes les colonnes ensemble.

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

Question

S'il vous plaît proposer un code derrière la solution (non XAML, parce que le contenu de la table est créée lors de l'exécution) en utilisant un document de flux, où les colonnes ne prennent que l'espace requis par leur contenu et où la fenêtre est seulement aussi large que le tabl e.

Pour ceux qui ne peuvent résister à marquer des questions comme des doublons

Il y a des gens sur stackoverflow qui empêchent que les questions peuvent être discutées correctement, en les marquant comme doublons après avoir lu brièvement la question. C'est plutôt frustrant. Avant de le faire, s'il vous plaît examiner attentivement si l'autre solution est juste sur les tables? Cette question est explicitement sur la correspondance de la largeur de la fenêtre à la largeur de la table et le code complet derrière doit être fourni.

Répondre

1

Si vous pouvez également passer un index de la colonne à laquelle vous ajoutez la cellule particulière, cette solution peut être réalisable.

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

Vous pourriez avoir à modifier la fonction measureText() pour utiliser la police que vous utilisez réellement.

+0

Il existe un code plus détaillé illustrant explicitement la mesure et la largeur de la colonne: [option wpf flowdocument table autofit] (https://stackoverflow.com/questions/1491285/wpf-flowdocument-table-autofit-option). Mais je n'aime pas définir la largeur de la colonne à une valeur fixe, car cela gâte d'autres fonctionnalités. Et de toute façon, j'ai mis la largeur de la colonne de la table à auto. Partout ailleurs dans WPF, cela signifie que la taille doit être fonction du contenu. Est-ce que je fais quelque chose de mal ? Comment l'auto est-elle utilisée correctement? –