C# 如何以编程方式滚动WPF listview?
是否可以通过编程方式滚动WPF listview?我知道winforms不会这么做,对吧 我说的是向上或向下滚动50个单位,等等。不要一次滚动整个项目的高度。你试过了吗?C# 如何以编程方式滚动WPF listview?,c#,.net,wpf,listview,C#,.net,Wpf,Listview,是否可以通过编程方式滚动WPF listview?我知道winforms不会这么做,对吧 我说的是向上或向下滚动50个单位,等等。不要一次滚动整个项目的高度。你试过了吗? 或者,如果它不是您带入视图的特定项目,而是与当前位置的偏移量,您可以使用。是的,您必须从列表视图中获取ScrollViwer,或者,一旦您可以访问它,您可以使用它公开的方法或覆盖滚动。您还可以通过获取主内容区域并使用其界面实现来滚动 这里有一个小助手,可以获取ListBox、ListView等的ScrollViwer组件 pu
或者,如果它不是您带入视图的特定项目,而是与当前位置的偏移量,您可以使用。是的,您必须从列表视图中获取ScrollViwer,或者,一旦您可以访问它,您可以使用它公开的方法或覆盖滚动。您还可以通过获取主内容区域并使用其界面实现来滚动 这里有一个小助手,可以获取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;
}
公共静态DependencyObject GetScrollViewer(DependencyObject o)
{
//如果是ScrollViewer,则返回DependencyObject
如果(o是ScrollViewer)
{返回o;}
for(int i=0;i
然后您可以像这样使用.LineUp()和.LineDown():
private void OnScrollUp(object sender, RoutedEventArgs e)
{
var scrollViwer = GetScrollViewer(uiListView) as ScrollViewer;
if (scrollViwer != null)
{
// Logical Scrolling by Item
// scrollViwer.LineUp();
// Physical Scrolling by Offset
scrollViwer.ScrollToVerticalOffset(scrollViwer.VerticalOffset + 3);
}
}
private void OnScrollDown(object sender, RoutedEventArgs e)
{
var scrollViwer = GetScrollViewer(uiListView) as ScrollViewer;
if (scrollViwer != null)
{
// Logical Scrolling by Item
// scrollViwer.LineDown();
// Physical Scrolling by Offset
scrollViwer.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>
private void OnScrollUp(对象发送方,路由目标)
{
var scrollViwer=GetScrollViewer(uiListView)作为ScrollViewer;
如果(scrollViwer!=null)
{
//按项逻辑滚动
//scrollViwer.LineUp();
//按偏移量进行物理滚动
scrollViwer.ScrollToVerticalOffset(scrollViwer.VerticalOffset+3);
}
}
private void OnScrollDown(对象发送器、路由目标)
{
var scrollViwer=GetScrollViewer(uiListView)作为ScrollViewer;
如果(scrollViwer!=null)
{
//按项逻辑滚动
//scrollViwer.LineDown();
//按偏移量进行物理滚动
scrollViwer.ScrollToVerticalOffset(scrollViwer.VerticalOffset+3);
}
}
LineUp和LineDown显示的逻辑滚动仍然是按项滚动的,如果要按设定的数量滚动,应该使用我上面使用的ScrollToHorizontal/VerticalOffset。如果您还需要一些更复杂的滚动,请查看我在本文中提供的答案。对于垂直向下和向上滚动,您将在“垂直偏移”中添加3。对吗?对于up,我们需要减3,而不是加。