向上/向下翻页 - 选择上一页/下一页上的项目WPF C#listbox) [英] Page up / page down – select to item on previous / next page WPF C# listbox)
本文介绍了向上/向下翻页 - 选择上一页/下一页上的项目WPF C#listbox)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
你好
我在Wpf中的Scrollviwer里面有ListView,Listbox有很多项目。我想逐页滚动列表框,点击页面向上/向下翻页按键。
我尝试过:
Hello
I am having ListView inside the Scrollviwer in wpf, Listbox caontain many items. I want to scroll the Listbox page by page on click of page up/ page down key press.
What I have tried:
<pre>if (e.Key == Key.PageDown && selector.SelectedIndex == -1)
{
itemToSelect = selector.ItemContainerGenerator.ContainerFromIndex(0) as ListViewItem;
}
它的滚动但没有选择下一页项目。
怎么做?
its srolling but not selecting the next page item.
How to do this?
推荐答案
这是一个简单的非MVVM解决方案,可以与VirtualizingStackPanel一起使用 - 使用100,000个项目进行测试。我们直接使用ListView的ScrollViewer。即使调整ListView的大小也会有效。
1. Xaml
Here is a simple non-MVVM solution that will work with a VirtualizingStackPanel - tested with 100,000 items. We work directly with the ListView's ScrollViewer. Will work even when the ListView is resized.
1. Xaml
<Window
x:Class="PagingVirtualListView.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Paging Virtualized ListView"
Height="300" Width="500" WindowStartupLocation="CenterScreen">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<ListView x:Name="PeopleList" ItemsSource="{Binding Persons}" >
<ListView.View>
<GridView>
<GridViewColumn Header="Avatar" Width="100">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding AvatarUrl}" Margin="10" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Name" Width="200" DisplayMemberBinding="{Binding Name}" />
<GridViewColumn Header="Age" Width="50" DisplayMemberBinding="{Binding Age}" />
</GridView>
</ListView.View>
</ListView>
<StackPanel Grid.Column="1" Margin="10" VerticalAlignment="Center">
<Button Content="PGUP" Click="OnPgUpClick" Padding="10 5" Margin="10"/>
<Button Content="PGDn" Click="OnPgDnClick" Padding="10 5" Margin="10"/>
</StackPanel>
</Grid>
</Window>
2.代码隐藏:
2. The code-behind:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
PeopleList.Loaded += PeopleList_Loaded;
DataContext = this;
Mock();
}
ScrollViewer lvScrollViewer;
public ObservableCollection<Person> Persons { get; set; }
= new ObservableCollection<Person>();
private Random rand = new Random();
private void Mock()
{
for (int i = 0; i < 100000; i++)
{
Persons.Add(new Person
{
AvatarUrl = "http://www.freepngimg.com/download/happy_person/2-2-happy-person-free-download-png.png",
Name =
人{i},
年龄= rand.Next( 20 , 60 )
});
}
}
私有 void PeopleList_Loaded( object sender,RoutedEventArgs e)
{
PeopleList.Loaded - = PeopleList_Loaded;
// 记住ListView的Scrollviewer
lvScrollViewer = PeopleList。 GetVisualChild<&的ScrollViewer GT;();
}
private void OnPgUpClick( object sender,RoutedEventArgs e)
{
lvScrollViewer.ScrollToVerticalOffset(
Math.Max( 0 ,lvScrollViewer.VerticalOffset - lvScrollViewer.ViewportHeight));
}
私有 void OnPgDnClick( object sender,RoutedEventArgs e)
{
lvScrollViewer.ScrollToVerticalOffset(
Math.Min(lvScrollViewer.VerticalOffset + lvScrollViewer.ViewportHeight,Persons.Count - 1 跨度>));
}
}
public static class HelperExtension
{
public static T GetVisualChild< T>( this Visual referenceVisual) where T:Visual
{
Visual child = null ;
for ( Int32 i = 0 ; i < VisualTreeHelper.GetChildrenCount(referenceVisual); i ++)
{
child = VisualTreeHelper.GetChild(referenceVisual,i) as Visual;
if (child!= null &&(child.GetType()== typeof (T)))
break ;
else if (child!= null )
{
child = GetVisualChild< T>(child);
if (child!= null &&(child.GetType()== typeof (T)))
break ;
}
}
返回子为 T;
}
}
public class Person
{
public string AvatarUrl {获得跨度>; set ; }
public string 名称{ get 跨度>; set ; }
public int 年龄{ get 跨度>; set ; }
}
"Person {i}", Age = rand.Next(20, 60) }); } } private void PeopleList_Loaded(object sender, RoutedEventArgs e) { PeopleList.Loaded -= PeopleList_Loaded; // remember the ListView's Scrollviewer lvScrollViewer = PeopleList.GetVisualChild<ScrollViewer>(); } private void OnPgUpClick(object sender, RoutedEventArgs e) { lvScrollViewer.ScrollToVerticalOffset( Math.Max(0, lvScrollViewer.VerticalOffset - lvScrollViewer.ViewportHeight)); } private void OnPgDnClick(object sender, RoutedEventArgs e) { lvScrollViewer.ScrollToVerticalOffset( Math.Min(lvScrollViewer.VerticalOffset + lvScrollViewer.ViewportHeight, Persons.Count - 1)); } } public static class HelperExtension { public static T GetVisualChild<T>(this Visual referenceVisual) where T : Visual { Visual child = null; for (Int32 i = 0; i < VisualTreeHelper.GetChildrenCount(referenceVisual); i++) { child = VisualTreeHelper.GetChild(referenceVisual, i) as Visual; if (child != null && (child.GetType() == typeof(T))) break; else if (child != null) { child = GetVisualChild<T>(child); if (child != null && (child.GetType() == typeof(T))) break; } } return child as T; } } public class Person { public string AvatarUrl { get; set; } public string Name { get; set; } public int Age { get; set; } }
享受。
Enjoy.
这篇关于向上/向下翻页 - 选择上一页/下一页上的项目WPF C#listbox)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文