1. 程式人生 > >用WPF做報表控制元件(四)

用WPF做報表控制元件(四)

表主體和表尾

表主體並沒有什麼難點,就是一個DataGrid,往裡面填充資料即可。表尾顯示的是一些統計資料,如平均值、最大值、最小值、累計值等。在這一部分的開發裡面,最複雜的是水平滾動條的問題。

一開始,我考慮用一個ScrollViewer把整個報表控制元件包起來。但當我填充大量資料的時候,我發現這樣做是有問題的。DataGrid本身只會初始化可視的內容,但當把DataGrid放在ScrollViewer裡面以後,相當於它可以無限延遲,整個都是可視的。那麼,它就要一次性把所有資料都初始化,當資料量大的時候,軟體會出現卡死的狀態。

那麼,DataGrid不能放在ScrollViewer裡面。水平滾動條是在最下方的,那麼我就給第三層(表尾)套上一個ScrollViewer。

<ScrollViewer Name="BottomGridOuter" Grid.Row="3" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Hidden" HorizontalAlignment="Left" ScrollChanged="BottomGridOuter_ScrollChanged">
    <StackPanel Name="BottomPanel" Orientation="Vertical">
    </StackPanel>
</ScrollViewer>

表尾加上滾動條之後,表尾在拖動的時候,表主體和表頭是不會一起動的,這明顯不滿足我們的需求。所以我們加入了滾動條滾動的事件,在事件裡面移動表頭和表主體,讓三者位置一致。

private void BottomGridOuter_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
    HeadGridOuter.ScrollToHorizontalOffset(BottomGridOuter.HorizontalOffset);

    DataGridAutomationPeer lvap = new DataGridAutomationPeer(BodyGrid);
    var svap = lvap.GetPattern(PatternInterface.Scroll) as ScrollViewerAutomationPeer;
    var scroll = svap.Owner as ScrollViewer;
    scroll.ScrollToHorizontalOffset(BottomGridOuter.HorizontalOffset);
}