2013-01-04 10 views
11

Ho un problema riguardante una strategia di divisione TableCell su WPF FlowDocumentTable.TableCell suddivisione dopo l'interruzione di pagina: parte rimanente suddivisa perde le proprietà della cella originale

Questo vuole essere un semplice codice che permette di riprodurre il problema:

MainWindow.xaml.cs

/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     var table = new Table() { BorderThickness = new Thickness(1), BorderBrush = Brushes.Black, CellSpacing = 0 }; 
     var rowGroup = new TableRowGroup(); 
     var tableRow = new TableRow(); 
     var cell1 = new TableCell() { Background = Brushes.Red, BorderThickness = new Thickness(0, 0, 1, 0), BorderBrush = Brushes.Black }; 
     var cell2 = new TableCell() { Background = Brushes.Red }; 

     cell1.Blocks.Add(new Paragraph(new Run("Cell 1 ******************************************************************************"))); 
     cell2.Blocks.Add(new Paragraph(new Run("Cell 2"))); 
     tableRow.Cells.Add(cell1); 
     tableRow.Cells.Add(cell2); 
     rowGroup.Rows.Add(tableRow); 
     table.RowGroups.Add(rowGroup); 

     var flowDocument = new FlowDocument(); 
     flowDocument.Blocks.Add(table); 

     Content = flowDocument; 
    } 
} 

Ed ecco il risultato:

TableCell Split

Come si può vedere nella seconda pagina, la cella di destra Il colore di sfondo è perso.

Qualcuno ha già riscontrato questo problema? Qualsiasi soluzione/soluzione sarà ben accetta!

Edit 1: Tutte le proprietà si perdono in modo da impostare il colore di sfondo sulla riga/colonna non risolverà il mio problema (ho principalmente questioni riguardanti TableCell Border Spessori)

Ecco una schermata che mostra il problema con bordi:

enter image description here

Edit 2: Guardando Visual Tree è abbastanza istruttiva. Il processo di impaginazione sembra generare solo un ParagraphVisual per la riga nella seconda pagina, spiegando così la perdita di tutti gli effetti visivi. Non v'è alcun visivo, e quindi senza sfondo/Confini/etc ... Una soluzione potrebbe essere quella di modificare il DocumentPaginator associata al FlowDocument

enter image description here

risposta

2

Purtroppo non sono riuscito a trovare una soluzione. Questo sembra essere un bug inerente al FlowDocument di WPF e non è facile trovare un punto di ingresso nel processo di impaginazione.

Il mio obiettivo principale era quello di fare in modo che le tabelle si dividessero correttamente tra le pagine del mio documento, quindi alla fine ho deciso di consentire a Table di dividere, ma non le celle.

Questo è stato abbastanza facile da fare, ho dovuto avvolgere la mia contenuto delle celle in un BlockUIContainer come questo:

cell1.Blocks.Add(new BlockUIContainer() { Child = new TextBlock() { Text = "Cell 1 ******************************************************************************", TextWrapping = TextWrapping.Wrap}}); 

Questo mi permette di evitare di avere confini mancanti nelle tabelle di divisione, ma le cellule non possono dividere più.

Questo non è soddisfacente, ma è il migliore che sono riuscito a ottenere.

2

ho cambiato il codice per dimostrare ancora di più quello che Eyal H ha dichiarato:

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

     var table = new Table() { BorderThickness = new Thickness(1), BorderBrush = Brushes.Black, CellSpacing = 4 }; 
     var rowGroup = new TableRowGroup(); 
     var tableRow = new TableRow(); 
     var cell1 = new TableCell() { RowSpan = 1, Background = Brushes.Red, BorderThickness = new Thickness(3, 3, 3, 3), BorderBrush = Brushes.Green }; 
     var cell2 = new TableCell() { RowSpan = 1, Background = Brushes.Red, BorderThickness = new Thickness(2, 2, 2, 2), BorderBrush = Brushes.Blue }; 

     var correctContent = "**************************************************************************************************************************************************************************************************************************************"; 

     cell1.Blocks.Add(new Paragraph(new Run("Cell 1" + correctContent))); 
     cell2.Blocks.Add(new Paragraph(new Run("Cell 2" + correctContent.Replace("*"," ")+"."))); 
     tableRow.Cells.Add(cell1); 
     tableRow.Cells.Add(cell2); 
     rowGroup.Rows.Add(tableRow); 
     table.RowGroups.Add(rowGroup); 

     var flowDocument = new FlowDocument(); 
     flowDocument.Blocks.Add(table); 

     Content = flowDocument; 
    } 
} 

La cella 2 ha molti spazi che terminano con un punto. La cella 1 si adatta alla pagina 1 e una cella vuota senza bordi (e nessun colore) viene posizionata nella seconda pagina. Non ero in grado di trovare una proprietà di qualsiasi oggetto Table o DocumentPaginator nella gerarchia che avrebbe a che fare con le interruzioni di pagina all'interno delle celle.

Cell 1 made shorter

"Poiché la Cell2 è più corta della pagina non divide e quindi un 'vuoto' cella si trova alla seconda pagina (con immobili)"

Forse è tempo per un Collega l'articolo?

+0

Problema simile su SO: http://stackoverflow.com/questions/1707363/flowdocument-force-a-pagebreak-breakpagebefore – milivojeviCH

+0

Thx per la modifica del codice. Dimostra un po 'di più qual è il problema e come le proprietà di impostazione su Riga/Colonne non possono risolverlo. – Sisyphe

-2

Penso che l'aggiunta di TableColumn risolverà il problema. di seguito è riportato il codice di esempio.

var table = new Table() { BorderThickness = new Thickness(1), BorderBrush = Brushes.Black, CellSpacing = 0 }; 
     var rowGroup = new TableRowGroup(); 
     var tableRow = new TableRow(); 
     var tableColumn1 = new TableColumn { Background = Brushes.Red }; 
     var tableColumn2 = new TableColumn { Background = Brushes.Red }; 
     var cell1 = new TableCell() { Background = Brushes.Red, BorderThickness = new Thickness(0, 0, 1, 0), BorderBrush = Brushes.Black }; 
     var cell2 = new TableCell() { Background = Brushes.Red }; 

     cell1.Blocks.Add(new Paragraph(new Run("Cell 1 ******************************************************************************"))); 
     cell2.Blocks.Add(new Paragraph(new Run("Cell 2"))); 
     tableRow.Cells.Add(cell1); 
     tableRow.Cells.Add(cell2); 
     rowGroup.Rows.Add(tableRow); 
     table.Columns.Add(tableColumn1); 
     table.Columns.Add(tableColumn2); 
     table.RowGroups.Add(rowGroup); 

     var flowDocument = new FlowDocument(); 
     flowDocument.Blocks.Add(table); 

     Content = flowDocument; 
+0

Come esplicitamente indicato nella domanda ("Tutte le proprietà sono perse quindi l'impostazione del colore di sfondo sulla riga/colonna non risolverà il mio problema (ho principalmente problemi riguardanti gli spessori dei bordi TableCell"), e su una risposta precedente che è stata cancellata, no, questo non risolve il mio problema – Sisyphe

+0

penso che il bordo del tablecell sia visibile, l'ho controllato impostando il suo valore a 10px, dato che io sono un nuovo utente non potrei allegare uno screenshot – Deepak

+0

Nel tuo codice, lo è. Imposta il bordo sulla seconda cella come nella risposta mceda, vedrai che è perso. – Sisyphe

Problemi correlati