向上/向下翻页 - 选择上一页/下一页上的项目WPF C#listbox) [英] Page up / page down – select to item on previous / next page WPF C# listbox)

查看:947
本文介绍了向上/向下翻页 - 选择上一页/下一页上的项目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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆