从下到上进行增量加载
本文关键字:加载 从下到上 | 更新日期: 2023-09-27 17:56:18
我已经在 WinRT 中实现了 ISupportIncrementalLoading
以在ListView
中增量加载,它工作得很好。问题是新项目被添加到列表底部,要查看更多项目,我需要向下走。我需要的是相反的。我希望看到更多项目,我需要向上滚动。该列表基本上是一个日志文件,最新日期必须显示在列表底部,如果我想查看较旧的记录,则需要使用向上滚动。
有没有办法做到这一点?
我知道
,这个问题很旧,但我遇到了同样的问题,没有找到一个好的解决方案。
因此,我将为其他有相同问题的人发布我的解决方案。
我的第一个解决方案是我自己的 IncrementalLoadCollection,其中包含用于滚动和加载数据的自定义行为。它工作正常,但对我来说不是很好。
因此,我尝试了另一个强大的 XAML 技巧,它运行良好,除了一个小的鼠标滚轮行为。现在:)颠倒了。
解决方案非常简单且功能强大。只需将列表视图的滚动查看器旋转 180°,然后翻转它即可使滚动条再次位于右侧。然后对项目执行相同的操作,以便它们再次正确。
就是这样。增量加载由 ListView 处理,触摸事件和滚动条工作正常,只是鼠标滚轮行为现在被反转。
我的代码
<ListView Grid.Row="1" x:Name="ChatListView" ItemsSource="{TemplateBinding ItemsSource}"
SelectionMode="None"
IsItemClickEnabled="False"
IsZoomedInView="False"
ShowsScrollingPlaceholders="False"
VerticalContentAlignment="Top"
VerticalAlignment="Stretch"
Margin="10,5">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListViewItem">
<ContentPresenter/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemContainerTransitions>
<TransitionCollection/>
</ListView.ItemContainerTransitions>
<ListView.Template>
<ControlTemplate>
<Border BorderThickness="{TemplateBinding BorderThickness}"
Padding="{TemplateBinding Padding}"
BorderBrush="{TemplateBinding BorderBrush}"
Background="{TemplateBinding Background}">
<ScrollViewer ZoomMode="Disabled" x:Name="ScrollViewer" RenderTransformOrigin="0.5,0.5">
<ScrollViewer.RenderTransform>
<CompositeTransform Rotation="180" ScaleX="-1"/>
</ScrollViewer.RenderTransform>
<ItemsPresenter x:Name="ItemsPresenter"/>
</ScrollViewer>
</Border>
</ControlTemplate>
</ListView.Template>
<ListView.ItemTemplate>
<DataTemplate>
<controls:ChatMessageControl Message="{Binding Message}"
ChatFrom="{Binding Name}"
IsMy="{Binding IsMy}"
ShortTime="{Binding CreatedTime}"
RenderTransformOrigin="0.5,0.5">
<controls:ChatMessageControl.RenderTransform>
<CompositeTransform Rotation="180" ScaleX="-1"/>
</controls:ChatMessageControl.RenderTransform>
</controls:ChatMessageControl>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
参考Demetrius Axenowski的回答,这是我反转鼠标滚轮输入的方法。
注意我正在将其用于仅限桌面的应用程序
1) 在 ListView 的 ScrollViewer 中找到第一个网格,并挂接 PointerWheelChanged 事件。
this._ScrollViewer = this.GetChildren<ScrollViewer>().FirstOrDefault();
if (this._ScrollViewer == null)
{
throw new InvalidOperationException("ScrollViewer not found.");
}
this._ScrollViewerInsetBorder = this.GetChildren<Border>().FirstOrDefault();
this._BorderInsetGrid = this.GetChildren<Grid>().FirstOrDefault();
this._BorderInsetGrid.AddHandler(ScrollViewer.PointerWheelChangedEvent, new PointerEventHandler(this.SW_Handler_OnPointerWheelChanged), true);
2) 覆盖鼠标滚轮行为。
double desiredVerticalOffset = 0;
private void SW_Handler_OnPointerWheelChanged(object sender, PointerRoutedEventArgs e)
{
PointerPoint mousePosition = e.GetCurrentPoint(sender as UIElement);
var delta = mousePosition.Properties.MouseWheelDelta;
// calculate desiredOffset
desiredVerticalOffset = desiredVerticalOffset + delta;
// limit desiredOffset.
desiredVerticalOffset = desiredVerticalOffset < 0 ? 0 : desiredVerticalOffset;
desiredVerticalOffset = desiredVerticalOffset > _ScrollViewer.ScrollableHeight ? _ScrollViewer.ScrollableHeight : desiredVerticalOffset;
if (delta < 0 || delta > 0)
{
_ScrollViewer.ChangeView(null, desiredVerticalOffset, null, false);
e.Handled = true;
}
}