【问题标题】:WPF ListBox loading items on demand and case if there is not enough items in the list如果列表中没有足够的项目,WPF ListBox 按需加载项目和案例
【发布时间】: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,如果它不可见,那么它应该在用户滚动时尝试获取数据。

【问题讨论】:

    标签: c# wpf listbox


    【解决方案1】:

    答案是PreviewMouseWheel

     scrollViewer.PreviewMouseWheel += delegate
                {
                    var visibility = scrollViewer.ComputedVerticalScrollBarVisibility;
                    if (visibility == Visibility.Collapsed)
                    {
                        //try to fetch data
                    }
                };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2017-11-18
      • 1970-01-01
      • 2014-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多