在FlowDocument中设置TableCell垂直居中遇到的问题


最近在程序中用到了WPF中的FlowDocument生成一个文档,其中有对System.Windows.Documents.Table的使用,在使用的过程中发现这家伙居然不支持设置垂直居中。一个程序,内部逻辑是里子,外部显示是面子,而boss显然是既要里子更要面子,于是折腾开始。

先对着MSDN撸,无果。接着满世界问问题,在stackoverflow上提问题,有人给了个线索,这个针对一个TableRow只有一个TableCell的情况时是极好的,奈何前期别人已经将程序写成了一个TableRow中有多个TableCell,要我再去更改程序逻辑比较头疼。于是上MSDN论坛求助,热心的老外给了我一个计算TableCell高度的方法(虽然最后发现有点问题,还是非常感谢)。

最后的方法是通过遍历Table来获取其每行的高度,并通过设置该行TableCell的padding,使其呈现垂直居中的效果。获取行高度的方法如下:

        private double getRowHeight(TableRow row)
        {
            double maxHeight = 0;
            foreach (TableCell cell in row.Cells)
            {
                Rect startRect = cell.ElementStart.GetCharacterRect(LogicalDirection.Forward);
                Rect endRect = cell.ElementEnd.GetNextInsertionPosition(LogicalDirection.Backward).GetCharacterRect(LogicalDirection.Forward);
                double Height = (endRect.Bottom - startRect.Top);
                maxHeight = maxHeight > Height ? maxHeight : Height;
            }
            return maxHeight;
        }


具体的遍历方法就不贴了,然后是通过一个按钮来触发垂直居中的设置,为了避免设置过程中界面卡死,采用异步刷新的方式,并且将后台线程中调用操作的优先级设置得较低。


好了,思路就是这样,个人感觉还是比较挫,不过鉴于我是一个菜鸟,再接再厉吧。

posted @ 2019-12-15 09:26  夜读春秋  阅读(361)  评论(0编辑  收藏  举报