是否可以通过编程方式滚动 WPF 列表视图?我知道 winforms 不会这样做,对吗?
我说的是向上或向下滚动 50 个单位等。而不是一次滚动整个项目高度。
您必须从 ListView 中获取 ScrollViewer 并使用它公开的方法来覆盖滚动。您还可以通过获取主要内容区域并使用它的 IScrollInfo 接口实现来进行滚动。
这里有一个小助手,可以获取 ListBox、ListView 等的 ScrollViwer 组件。
public static DependencyObject GetScrollViewer(DependencyObject o)
{
// Return the DependencyObject if it is a ScrollViewer
if (o is ScrollViewer)
{ return o; }
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(o); i++)
{
var child = VisualTreeHelper.GetChild(o, i);
var result = GetScrollViewer(child);
if (result == null)
{
continue;
}
else
{
return result;
}
}
return null;
}
然后你可以像这样使用 .LineUp() 和 .LineDown() :
private void OnScrollUp(object sender, RoutedEventArgs e)
{
var scrollViewer = GetScrollViewer(uiListView) as ScrollViewer;
if (scrollViewer != null)
{
// Logical Scrolling by Item
// scrollViewer.LineUp();
// Physical Scrolling by Offset
scrollViewer.ScrollToVerticalOffset(scrollViwer.VerticalOffset - 3);
}
}
private void OnScrollDown(object sender, RoutedEventArgs e)
{
var scrollViewer = GetScrollViewer(uiListView) as ScrollViewer;
if (scrollViewer != null)
{
// Logical Scrolling by Item
// scrollViewer.LineDown();
// Physical Scrolling by Offset
scrollViewer.ScrollToVerticalOffset(scrollViwer.VerticalOffset + 3);
}
}
<DockPanel>
<Button DockPanel.Dock="Top"
Content="Scroll Up"
Click="OnScrollUp" />
<Button DockPanel.Dock="Bottom"
Content="Scroll Down"
Click="OnScrollDown" />
<ListView x:Name="uiListView">
<!-- Content -->
</ListView>
</DockPanel>
LineUp 和 LineDown 公开的逻辑滚动仍然按项目滚动,如果您想滚动一定量,您应该使用我上面使用的 ScrollToHorizontal/VerticalOffset。如果您想要更复杂的滚动,请查看我在这个其他问题中提供的答案。
您尝试过ScrollIntoView吗? 或者,如果它不是您带入视图的特定项目,而是相对于当前位置的偏移,您可以使用 BringIntoView。