2011-04-13 16 views
0

我目前正在開發一個應用程序,它根據時間軸上的時間戳顯示數據項。下面的截圖給你一個想法:如何有效地實現ScrollViewer背景網格?

Screenshot http://www.antiserum.ch/Screenshot.png

的時間表包含每十毫秒指標線。它使用Canvas將數據項呈現在正確的位置,並使用StackPanel顯示索引線。

你在sceenshot中看到的就是我想要達到的目標。但是,要顯示索引行,我正在填充TimeSpan對象列表,每個對象增加10ms,以獲取完整的數據集持續時間。該列表顯示在具有項目數據模板的ItemsControl中,該模板繪製白線,黑框和文本。

正如你可以想象的那樣,從性能的角度來看,這可能是最糟糕的方法,因爲ItemsControl僅包含1000個元素,只有10秒鐘的數據。

所以我的問題是,我如何有效地繪製索引標記?

我已經考慮過使用VirtualizingStackPanel來顯示TimeSpan項目。這不是一個選項,因爲ScrollViewer不直接包含索引列表。看來虛擬化在這種情況下不起作用。

爲了清楚起見,這裏是我的XAML代碼片段(I除去模板和造型代碼):

<ScrollViewer x:Name="timelineScroller"> 
    <Grid> 
    <ItemsControl x:Name="IndexMarkers" ItemsSource="{Binding IndexMarkers}" /> 
    <ItemsControl x:Name="TimelineList" ItemsSource="{Binding Lines}" /> 
    </Grid> 
</ScrollViewer> 

一種可能的解決方案可以是子類的ScrollViewer並繪製索引行和文字的背景渲染時的ScrollViewer。這應該是有效的,因爲它只能渲染實際可見的線條。但是,我沒有找到關於如何實現這種渲染定製的信息。

任何想法表示讚賞。

問候, 丹尼爾

回答

1

我最終採用的方法似乎工作得很好,沒有任何虛擬化:

索引標記的列表是con stant,但根據當前時間取模RenderTransform-ed標記寬度。這使ScrollViewer背景隨着鼠標移動,並突然跳回到原始位置(這發生在值通過模操作被「纏繞」時發生。

所有仍有待完成的事情是更新標籤標記恰好在那一刻,這種方法效果很好,標籤的跳躍對用戶來說是不可感知的。

0

這聽起來像你可能需要顯式地實施虛擬化。

請記住,您可能要集中標記(如重用,其中可能的,因爲在創建/銷燬標記,因爲它試圖清理所有這些對象可能會導致一些嚴重的垃圾收集顛簸相同的元素。

如果你使用了Canvas,你可以基本修改代碼中畫布的子項,以顯示你想要的元素(指定它們的座標)。

+0

問題是有問題的列表是使用VirtualizingStackPanel實現的,但VSP無法虛擬化,因爲它不是相應ScrollViewer的直接子節點。因此,即使我自己實施,虛擬化也不會發生。 – theDmi 2011-04-13 15:12:38