1
必要に応じてListBoxにアイテムをロードするロジックを実装しようとしています。ユーザーがスクロールバーまたはマウスホイールを使用してスクロールすると、それ以上のデータがあるかどうかがチェックされ、ロードされます。私が持っている唯一の問題は、ListBoxを埋めるための項目が不足してScrollBarが表示されず、結果としてMouseWheelイベントもScrollViewer.VerticalOffsetProperty ValueChanged
イベントハンドラも呼び出されないということです。WPFリストボックスは、必要な場合にアイテムをロードし、リストに項目がない場合
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);
}
});
}
私はそれがScrollViewerの基礎となるで扱わいないにもかかわらず、ListBox.MouseWheelイベントが呼び出されないことに驚いています。私はComputedVerticalScrollBarVisibility
を利用したいと思っています。もしそれが見えないなら、ユーザがスクロールするたびにデータを取得しようとするべきです。