开发者

WPF Document: Getting the Table Cell borders right

I created this pic in MS Word and I am trying to replicate the style in my WPF app using the Documents. First the 'from':

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

Next my attempt to replicate:

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

My question is probably rather obvious. What am I doing wrong? I can't find a padding property on the rowgrouping or the row. Below is my 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 SolidColo开发者_高级运维rBrush(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;
    }


Unfortunately you cannot set the border for a TableRow in a FlowDocument. It is only available for the Table or the TableCell. Even I wonder why this was not provided.

Although one way to achieve a row border effect is to use border of all cells in conjunction with BorderThickness, and setting CellSpacing of the container Table to 0. For eg:

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


Yogesh, sorry for this late answer but I just arrived to this question. Maybe the answer can help others.

In this particular case, you need to set a table.BorderThickness to 1, table.CellSpacing to 0, and the either top OR bottom border for each cell.

In order to avoid to set the thickness to (0,1,0,0) for each cell, you can use styles. There are many ways to do this, but I will show you a simple one. In your App.xaml, write the following:

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

After that, merge the application dictionary into your document or table, with something like:

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

You can have styles for the whole document, an individual table and even an individual row or cell.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜