WPF操作滚动条

        最近客户反映一个滚动条的用户体验问题,在ListView加很多项出现滚动条后,滚动条会向上走(看不到刚加的那一项),只能每次加了之后再滑下来看。调查了下原来是ListView的默认滚动条的问题,设法操作这个滚动条,无果,于是加了个滚动条控件,用ScollToEnd方法将滚动条重置到最下面。测试时发现当鼠标在ListView上时滚轮没反映,于是找了下事件,MouseWheel和PreviewMouseWheel两个事件,发现MouseWheel没有效果(有点撞大运的感觉,只是第一次没撞上),PreviewMouseWheel可以的,但从MSDN上真没看出什么不一样,两个的描述都是“在鼠标指针位于此元素上并且用户滚动鼠标滚轮时发生”。至此问题算解决了,解决的过程中把滚动条的一些其他方法也都了解了下,特此记录。
        写了个示例,代码如下:

        设计页面,左边的是原生态的ListView,右边用ScrollViewer包装:

<Window x:Class="WPFScrollViewer1210.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel Orientation="Horizontal">
        <ListView Name="listView" Width="200" 
                  HorizontalAlignment="Left"></ListView>
        <StackPanel VerticalAlignment="Center">
            <Button Name="btnAdd" Height="30" Width="100" 
                    Content="Left Add New" Click="btnAdd_Click"></Button>
            <Button Name="btnAddRight" Height="30" Width="100" 
                    Content="Right Add New" Click="btnAddRight_Click"></Button>
        </StackPanel>
        <ScrollViewer Name="scrollbar" VerticalScrollBarVisibility="Auto">
            <ListView Name="listViewScroll" 
                      PreviewMouseWheel="listViewScroll_PreviewMouseWheel"></ListView>
        </ScrollViewer>

    </StackPanel>
</Window>
        后台代码:

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace WPFScrollViewer1210
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void btnAdd_Click(object sender, RoutedEventArgs e)
        {
            int count = 0;
            while (count++ < 10)
            {
                ListViewItem item = new ListViewItem();
                item.Content =string.Concat(listView.Items.Count.ToString() 
                    , "." 
                    , DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
                listView.Items.Add(item);
            }
        }

        private void btnAddRight_Click(object sender, RoutedEventArgs e)
        {
            int count = 0;
            while (count++ < 10)
            {
                listViewScroll.Items.Add(
                    new ListViewItem() 
                    { 
                        Content = listViewScroll.Items.Count.ToString()+ "."
                        + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")
                    });
            }
            scrollbar.ScrollToEnd();
        }

        void listViewScroll_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
        {
            scrollbar.ScrollToVerticalOffset(scrollbar.VerticalOffset - e.Delta / 2);
            e.Handled = true;
        }
    }
}
        ScrollViewer控件的其他方法:
        LineUp向上滚动一行,LineDown向下滚动一行,LineRight和LineLeft类似;
        PageUp向上滚动一行,PageDown、PageRight和PageLeft类似;
        ScrollToEnd滚动条置为最下面,ScrollToHome、ScrollToRightEnd、ScrollToLeftEnd类似;
        ScrollToVerticalOffset设置滚动条的垂直偏移量、ScrollToHorizontalOffset类似;
        VerticalScrollBarVisibility属性设置滚动条的显示方式;
        子控件响应滚动条事件用PreviewMouseWheel事件,事件中可以滚动滚动条或者进行其他业务逻辑,设置滚动条的方法如下:

        scrollbar.ScrollToVerticalOffset(scrollbar.VerticalOffset - e.Delta / 2);这里除了2是为了降低滚轮的敏感度,也可乘以某个倍数以扩大敏感度,其中关于e.Delta的请查看MSDN。

        源码下载

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值