2013-01-04 11 views
11

Mam problem ze strategią dzielenia TableCell dla WPF FlowDocumentTable.TableCell split po stronie break: reszta podzielona część traci oryginalne właściwości komórki

Oto prosty kod pozwalający odtworzyć problem:

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

A oto wynik:

TableCell Split

jak ty widać na drugiej stronie, właściwa komórka Kolor tła jest tracony.

Czy ktoś już napotkał ten problem? Każde rozwiązanie/obejście będzie mile widziane!

Edit 1: Wszystkie właściwości są tracone więc ustawienie koloru tła na wiersz/kolumna nie rozwiąże mój problem (mam głównie problemy dotyczące TableCell granicznej grubości)

Tutaj jest ekran pokazujący problem z granicami:

enter image description here

Edit 2: Patrząc na Visual drzewo jest dość pouczająca. Wydaje się, że proces stronicowania generuje tylko akapit ParagraphVisual dla wiersza na drugiej stronie, wyjaśniając w ten sposób utratę wszystkich efektów wizualnych. Nie ma audiowizualny, a tym samym bez tła/Granice/etc ... rozwiązanie może być Wykręcanie DocumentPaginator powiązanych z FlowDocument

enter image description here

Odpowiedz

2

Niestety, nie byłem w stanie znaleźć rozwiązania. Wydaje się, że jest to błąd związany z WPF FlowDocument i nie jest łatwo znaleźć punkt wejścia w procesie paginacji.

Moim głównym celem było prawidłowe rozdzielanie tabel na stronach w moim dokumencie, więc w końcu zdecydowałem się zezwolić na podział tabeli, ale nie na komórki.

To było dość łatwe do zrobienia, po prostu musiałem zawijać moje zawartość komórek w BlockUIContainer tak:

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

To pozwala mi uniknąć brakuje granic w Split tabel, ale komórki nie mogą podzielić już.

To nie jest satysfakcjonujące, ale jest najlepsze, co udało mi się osiągnąć.

2

Zmieniłem swój kod do wykazania, co jeszcze bardziej Eyal H stwierdził:

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

Komórka 2 ma wiele spacji zakończonych kropką. Komórka 1 mieści się na stronie 1, a na drugiej stronie umieszczona jest pusta komórka bez obramowań (i bez koloru). Nie mogłem znaleźć w hierarchii właściwości żadnego obiektu Table lub DocumentPaginator, który zajmowałby się podziałami stron w komórkach.

Cell 1 made shorter

„Ponieważ CELL2 jest krótszy niż strona to nie dzieli a zatem«pusty»komórka znajduje się na drugiej stronie (bez nieruchomości)”

Może nadszedł czas na Połącz artykuł?

+0

Podobny problem na stronie: http://stackoverflow.com/questions/1707363/flowdocument-force-a-pagebreak-breakpagebefore – milivojeviCH

+0

Thx do edycji kodu. To pokazuje nieco więcej, czym jest problem i jak nie można go rozwiązać, ustawiając właściwości w wierszu/kolumnie. – Sisyphe

-2

Myślę, że dodanie TableColumn rozwiąże problem. poniżej znajduje się przykładowy kod.

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

Jak wyraźnie podano w pytaniu ("Wszystkie właściwości są tracone, więc ustawienie koloru tła w wierszu/kolumnie nie rozwiąże mojego problemu (mam głównie problemy z grubością obramowania TableCell"), a po poprzedniej odpowiedzi, która została usunięta, Nie, to nie rozwiązuje mojego problemu – Sisyphe

+0

Myślę, że granica z tablecell jest widoczna, sprawdziłem ją, ustawiając jej wartość na 10px Jako, że jestem nowym użytkownikiem, nie mogłem dołączyć zrzutu ekranu – Deepak

+0

W twoim kodzie jest. Ustaw granicę na drugiej komórce, jak w odpowiedzi na mceda, zobaczysz, że jest zgubiona. – Sisyphe