[英]Getting valid values from ScrollInfo of a ListBox
我有一个ListBox,我面临的问题是试图从IScrollInfo
对象获取有效值。
通过将ListBox的MaxHeight设置为150,我知道ViewportHeight应该在这个大小左右,并且整个高度是它的两倍,因此ExtentHeight应该是300。
我从中获得以下值:
_scrollInfo.ExtentHeight = 13
_scrollInfo.ViewportHeight = 7
_scrollInfo.VerticalOffset = varying but 1-6
来自的值:
UIElement scrollable = _scrollInfo as UIElement;
似乎是正确的。
scrollable.RenderSize.Height = 146
大致正确。
我想知道的是:
当我的ListBox控件第一次加载时,它绑定到一个空的ObservableCollection
。 直到后来才添加项目。 可能是IScrollInfo对象保留了ListBox为空时的这些初始值吗?
IScrollInfo对象的另一件事是VirtualizingStackPanel
,这对事情有影响吗?
[编辑]
尝试将VirtualizingStackPanel
更改为StackPanel
,但是我仍然得到相同的结果。
此行为由ScrollViewer.CanContentScroll="True"
给出。它基本上说,不允许按像素滚动,而只能按项目滚动。
考虑以下示例:
private void ScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
var scrollViewer = (ScrollViewer) sender;
Trace.WriteLine(string.Format("ExtentHeight: {0}, ViewportHeight : {1}, VerticalOffset : {2}",
scrollViewer.ExtentHeight, scrollViewer.ViewportHeight, scrollViewer.VerticalOffset));
}
<ScrollViewer Height="150" ScrollChanged="ScrollViewer_ScrollChanged" CanContentScroll="True">
<VirtualizingStackPanel>
<Rectangle Height="40" Margin="5" Fill="Red" />
<Rectangle Height="40" Margin="5" Fill="Green" />
<Rectangle Height="40" Margin="5" Fill="Blue" />
<Rectangle Height="40" Margin="5" Fill="Red" />
<Rectangle Height="40" Margin="5" Fill="Green" />
<Rectangle Height="40" Margin="5" Fill="Blue" />
<Rectangle Height="40" Margin="5" Fill="Red" />
</VirtualizingStackPanel>
</ScrollViewer>
您得到以下输出:
ExtentHeight: 7, ViewportHeight : 3, VerticalOffset : 0
ExtentHeight: 7, ViewportHeight : 3, VerticalOffset : 1
ExtentHeight: 7, ViewportHeight : 3, VerticalOffset : 2
但是当您设置CanContentScroll="False"
:
ExtentHeight: 350, ViewportHeight : 150, VerticalOffset : 3,01724137931035
ExtentHeight: 350, ViewportHeight : 150, VerticalOffset : 6,03448275862069
ExtentHeight: 350, ViewportHeight : 150, VerticalOffset : 9,05172413793104
ExtentHeight: 350, ViewportHeight : 150, VerticalOffset : 12,0689655172414
ExtentHeight: 350, ViewportHeight : 150, VerticalOffset : 15,0862068965517
ExtentHeight: 350, ViewportHeight : 150, VerticalOffset : 18,1034482758621
ExtentHeight: 350, ViewportHeight : 150, VerticalOffset : 21,1206896551724
在第一个示例中,您将按项目滚动。 您有七个项目,因此ExtentHeight为7,可见的项目为3,因此ViewportHeight为3。
在第二个示例中,您按像素滚动,因此ExtentHeight是所有项目的总高度,视口高度是scrollviewver的高度
故事的寓意是,在某些情况下,您不想度量所有项目的大小,因为它可能会对性能产生负面影响。 尤其是在虚拟化元素时。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.