2009-11-04 6 views
8

J'ai créé cette image dans MS Word et j'essaie de répliquer le style dans mon application WPF en utilisant les Documents. D'abord le 'de':WPF Document: Obtention des bordures de cellule de tableau correct

alt text http://img337.imageshack.us/img337/1275/correntborder.png

Suivant ma tentative de répliquer:

alt text http://img156.imageshack.us/img156/1711/extrawhiteborder.png

Ma question est probablement assez évident. Qu'est-ce que je fais mal? Je ne peux pas trouver une propriété de remplissage sur le rowgrouping ou la ligne. Ci-dessous mon code:

public override FlowDocument CreateDocumentSection(IInteractivityElement pElement) 
    { 
     var result = new FlowDocument(); 

     // show the header 
     result.Blocks.Add(CreateHeading(pElement.Header)); 

     // we don't show anything else if there aren't any columns 
     var nrColumns = pElement.GetIntegralData("CurrentColumnCount") ?? 0; 
     if (nrColumns == 0) return result; 

     Table mainTable = new Table(); 
     result.Blocks.Add(mainTable); 

     // columns 
     for (long tableIdx = 0; tableIdx < nrColumns; tableIdx++) 
     { 
      var newColumn = new TableColumn(); 
      mainTable.Columns.Add(newColumn); 
     } 

     // row group for header 
     TableRowGroup rowGroup = new TableRowGroup(); 
     mainTable.RowGroups.Add(rowGroup); 

     // row for header 
     TableRow headerRow = new TableRow(); 
     headerRow.Background = new SolidColorBrush(Color.FromRgb(79, 129, 189)); 
     headerRow.Foreground = new SolidColorBrush(Colors.White); 
     rowGroup.Rows.Add(headerRow); 

     // add columns for each header cell 
     for (long tableIdx = 0; tableIdx < nrColumns; tableIdx++) 
     { 
      var headerNameKey = CreateColumnNameKey(tableIdx); 
      TableCell headerCell = new TableCell(new Paragraph(new Run(pElement.GetStringData(headerNameKey)))); 
      headerRow.Cells.Add(headerCell); 
     } 

     TableRow emptyRow = new TableRow(); 
     emptyRow.Foreground = new SolidColorBrush(Colors.Gray); 
     rowGroup.Rows.Add(emptyRow); 

     TableCell emptyInstructionCell = new TableCell(); 
     emptyInstructionCell.BorderBrush = new SolidColorBrush(Color.FromRgb(79, 129, 189)); 
     emptyInstructionCell.BorderThickness = new Thickness(1.0); 
     emptyInstructionCell.ColumnSpan = Convert.ToInt32(nrColumns); 
     emptyInstructionCell.Blocks.Add(new Paragraph(new Run(pElement.Instruction))); 
     emptyRow.Cells.Add(emptyInstructionCell); 

     return result; 
    } 

Répondre

9

Malheureusement vous ne pouvez pas définir la frontière pour un TableRow dans un FlowDocument. Il est uniquement disponible pour le Table ou le TableCell. Même je me demande pourquoi cela n'a pas été fourni.

Bien que d'une façon d'obtenir un effet de bordure de ligne est d'utiliser la frontière de toutes les cellules conjointement avec BorderThickness, et la mise en CellSpacing du conteneur Table à 0. Par exemple:

table.CellSpacing = 0; 
... 
cellLeft.BorderThickness= new Thickness(1, 1, 0, 1); 
... 
cellCenter.BorderThickness= new Thickness(0, 1); 
... 
cellRight.BorderThickness= new Thickness(0, 1, 1, 1); 
5

Yogesh, désolé pour cette réponse tardive mais je viens d'arriver à cette question. Peut-être que la réponse peut aider les autres.

Dans ce cas particulier, vous devez définir une table.BorderThickness à 1, table.CellSpacing à 0 et la bordure supérieure OU inférieure de chaque cellule. Pour éviter de définir l'épaisseur (0,1,0,0) pour chaque cellule, vous pouvez utiliser des styles. Il y a plusieurs façons de le faire, mais je vais vous en montrer une simple. Dans votre App.xaml, écrivez ce qui suit:

<Application x:Class="YourNamespace.App" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:doc="clr-namespace:System.Windows.Documents;assembly=PresentationFramework"> 

    <Application.Resources> 
     <Style TargetType="doc:TableCell" > 
      <Setter Property="BorderBrush" Value="Blue" /> 
      <Setter Property="BorderThickness" Value="0,1,0,0" /> 
      <Setter Property="FontSize" Value="12" /> 
      <Setter Property="Padding" Value="2" /> 
     </Style>   
    </Application.Resources> 
</Application> 

Après cela, fusionner le dictionnaire de l'application dans votre document ou d'une table, avec quelque chose comme:

mainTable.Resources.MergedDictionaries.Add(App.Current.Resources); 

Vous pouvez avoir des styles pour le document entier, une table individuelle et même une ligne individuelle ou une cellule.

+0

si les cellules ne sont pas à la même hauteur alors vous avez des problèmes – GorillaApe