2012-03-02 144 views
1

在一個WPF應用程序中,我有一個ScrollViewer,其中是一個ItemsControl,其中的項目是數據綁定到一個集合,並且我有一個爲項目指定的模板。我希望ScrollViewer使用邏輯滾動,因此我設置了ScrollViewer.CanContentScroll =「True」標誌,並將ItemsControl的ItemsPanel模板設置爲StackPanel。ScrollViewer與itemscontrol邏輯滾動

但是,滾動仍然是物理的而不是邏輯的。我究竟做錯了什麼?

感謝 湯姆

+0

通過「物理而非邏輯」,是你使用「邏輯」來引用UI虛擬化?如果你,你可能會對這個問題感興趣:[虛擬化一個ItemsControl](http://stackoverflow.com/q/2783845/302677) – Rachel 2012-03-02 16:06:20

回答

0

很抱歉這麼晚纔回復... 這是(根據滾動像素)的東西,微軟「添加」到.NET 4.5。

在WPF 4上,TreeView確實有一個邏輯滾動,但ListBox和ItemsControl沒有。 那麼它如何在TreeView上而不是在ListBox上工作?這是一個應該詢問的問題,因爲滾動是由VirtualizingStackPanel管理的。

那麼,「祕密」在VirtualizingStackPanel的內部屬性中稱爲IsPixelBased。

如果您將其設置爲true,那麼您將獲得邏輯滾動回來。

但是,這有成本。看起來,對於大型物品來源(即使使用虛擬化和容器回收),滾動仍然很緩慢。 (大項目來源是50,000或100,000),而物理(基於項目)滾動則不是。

我希望這個問題在WPF解決了4.5

這裏是具有默認使用基於像素的滾動一個虛擬化pabel的例子:

public class VSP : VirtualizingStackPanel 
{ 
    public VSP() 
    { 
     typeof(VSP).GetProperty("IsPixelBased", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(this, true, null); 
    } 
}