最近在程序中用到了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;
}
具體的遍歷方法就不貼了,然後是通過一個按鈕來觸發垂直居中的設置,爲了避免設置過程中界面卡死,採用異步刷新的方式,並且將後臺線程中調用操作的優先級設置得較低。
好了,思路就是這樣,個人感覺還是比較挫,不過鑑於我是一個菜鳥,再接再厲吧。