2015-11-19 21 views
0

因此,我有一個ListView,其中包含16行和32列的UniformGrid,因爲它是ItemsPanelTemplate。 ItemsSource綁定到具有兩個屬性的對象的ObservableCollection:IsSelected和Value。 UniformGrid中的每個單元格都包含一個TextBlock,其Text屬性綁定到其各自項目的Value屬性。在這個構造下面,我有一個ScrollBar,其值的範圍從0到255.調整這個ScrollBar可以改變這個網格中所選項目的Value屬性。爲WPF中的多個TextBlocks呈現相同的文本

現在我畫了那張照片,這是問題所在。問題是當我選擇了很多插槽並更改ScrollBar的值時,它會立即更新所有的TextBlocks,導致可見的延遲。我搜索了互聯網尋找解決這個問題的辦法,閱讀了許多關於提高渲染性能等方面的文章。我曾嘗試使用字形來嘗試增加文本渲染的速度,這表現出了改進,但是延遲仍然非常明顯。

如果我可以以某種方式呈現文本只有一次值更改,並將其複製到所有其他選定的插槽,我認爲這會提高性能。有沒有辦法做到這一點?如果沒有,我是否應該採取不同的方式來做這種事情?

+0

這可能會被擊中或錯過,但有時當您在UI中具有這些可拖動的滾動條/滑塊元素時,拖動操作會希望垃圾郵件事件隊列,從而執行刷新UI元素。一個可能的解決方案是避免直接刷新這些元素,並引入一個計時器或在事件處理之間執行的其他操作,這些操作只會定期觸發這些刷新。這使得它不會排隊大量的級聯請求來更新UI元素,這些元素必須單獨處理...... –

+0

......這實際上並沒有加快單個刷新速度,但它有時可以大幅度提高通過定期刷新速度來感知速度,而不是將垃圾郵件發送給隊列(例如,您可能會比人眼可以感知到的工作量多100倍)。您可能實際上並不需要優化重繪,只需減少正在排隊的過多繪圖工作即可。就你而言,由於刷新發生在你背後,你可能會推遲對事件處理之間的固定時間間隔觸發刷新的值的更改。 –

回答

1

如果不是所有這些都可見,那麼可以通過查看使用VirtualizingStackPanel屬性來減少延遲。

VirtualizingStackPanel.IsVirtualizing="True" 
    VirtualizingStackPanel.VirtualizationMode="Recycling" 

http://miteshsureja.blogspot.com/2011/05/virtualizing-stack-panel-in-wpf.html

此外,如果是因爲它的滾動條可以改變值的速度和UI的平局就不能跟上....你可以用一個定時器每次調用滾動條/滑塊更改事件時都會重新啓動。

一旦計時器(假設你選擇1秒)沒有被更改事件重新啓動,它就會更新這些框全部綁定的值,以便只有當用戶停止移動滾動條/滑塊時才更新。

+0

所有插槽都可見。我明天會嘗試計時器的建議。謝謝您的回答。 – Robby

+0

這與設置綁定的Delay屬性沒有什麼不同嗎? – Robby

+0

應該功能類似,只是一個給你控制。延遲爲你工作? – CloudyOne

0

似乎沒有辦法輕鬆將呈現的文本複製到其他TextBlocks。提高渲染性能同時保持立即響應的唯一方法是切換到雕文。如果我找到一種呈現文本一次的方法,將會更新答案,並將其複製到其餘的字形中。