【发布时间】:2017-05-02 17:36:57
【问题描述】:
我正在尝试实现在 ListBox 中按需加载项目的逻辑。每当用户使用滚动条或鼠标滚轮滚动时,它都会检查是否有更多数据并加载它。我唯一的问题是没有足够的项目来填充 ListBox,因此 ScrollBar 不可见,因此 MouseWheel Event 和 ScrollViewer.VerticalOffsetProperty ValueChanged 事件处理程序都没有被调用。
static void AssignCommand(object sender, RoutedEventArgs e)
{
FrameworkElement element = (FrameworkElement)sender;
element.Loaded -= AssignCommand;
ScrollViewer scrollViewer = GetDescendantByType<ScrollViewer>(element);
if (scrollViewer == null)
{
throw new InvalidOperationException("ScrollViewer not found.");
}
element.MouseWheel += delegate
{
// listbox not called
};
scrollViewer.MouseWheel += delegate
{
// scrollviewer not called
var visibility = scrollViewer.ComputedVerticalScrollBarVisibility;
if (visibility == Visibility.Collapsed)
{
//try to fetch data
}
};
var dpd = DependencyPropertyDescriptor.FromProperty(ScrollViewer.VerticalOffsetProperty, typeof(ScrollViewer));
dpd.AddValueChanged(scrollViewer, delegate
{
bool atBottom = scrollViewer.VerticalOffset
>= scrollViewer.ScrollableHeight;
if (atBottom)
{
var atEnd = GetAtEndCommand(element);
atEnd?.Execute(null);
}
});
}
我很惊讶 ListBox.MouseWheel 事件没有被调用,即使它没有被底层 ScrollViewer 处理。我想利用ComputedVerticalScrollBarVisibility,如果它不可见,那么它应该在用户滚动时尝试获取数据。
【问题讨论】: