最近客户反映一个滚动条的用户体验问题,在ListView加很多项出现滚动条后,滚动条会向上走(看不到刚加的那一项),只能每次加了之后再滑下来看。调查了下原来是ListView的默认滚动条的问题,设法操作这个滚动条,无果,于是加了个滚动条控件,用ScollToEnd方法将滚动条重置到最下面。测试时发现当鼠标在ListView上时滚轮没反映,于是找了下事件,MouseWheel和PreviewMouseWheel两个事件,发现MouseWheel没有效果(有点撞大运的感觉,只是第一次没撞上),PreviewMouseWheel可以的,但从MSDN上真没看出什么不一样,两个的描述都是“在鼠标指针位于此元素上并且用户滚动鼠标滚轮时发生”。至此问题算解决了,解决的过程中把滚动条的一些其他方法也都了解了下,特此记录。
写了个示例,代码如下:
LineUp向上滚动一行,LineDown向下滚动一行,LineRight和LineLeft类似;
PageUp向上滚动一行,PageDown、PageRight和PageLeft类似;
ScrollToEnd滚动条置为最下面,ScrollToHome、ScrollToRightEnd、ScrollToLeftEnd类似;
ScrollToVerticalOffset设置滚动条的垂直偏移量、ScrollToHorizontalOffset类似;
VerticalScrollBarVisibility属性设置滚动条的显示方式;
子控件响应滚动条事件用PreviewMouseWheel事件,事件中可以滚动滚动条或者进行其他业务逻辑,设置滚动条的方法如下:
写了个示例,代码如下:
设计页面,左边的是原生态的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。