在WPF中,我知道我可以使用ListView.ScrollIntoView
到特定的项目滚动到视图,但它总能滚动的最小量,使得显示的项目。
我怎样才能使它滚动,这样我想展示的产品滚动到ListView的顶部?
我也想过打电话ScrollIntoView两次,一次在顶部我想要的项目,一旦最后显示的项目,但我不知道如何找出最后列示。
在WPF中,我知道我可以使用ListView.ScrollIntoView
到特定的项目滚动到视图,但它总能滚动的最小量,使得显示的项目。
我怎样才能使它滚动,这样我想展示的产品滚动到ListView的顶部?
我也想过打电话ScrollIntoView两次,一次在顶部我想要的项目,一旦最后显示的项目,但我不知道如何找出最后列示。
我们可以通过获得这样做的ScrollViewer存在于ListView的控件模板。 如果你有机会到ScrollViewer中则有很多暴露的不同的滚动方法。
首先,我们可以创建我们要添加这种效果到ListView:
<ListView ItemsSource="{Binding Percents}"
SelectionChanged="OnSelectionChanged"
x:Name="uiListView"/>
public List<int> Percents { get; set; }
public Window1()
{
InitializeComponent();
Percents = new List<int>();
for (int i = 1; i <= 100; i++)
{
Percents.Add(i);
}
this.DataContext = this;
}
我们也将需要的东西,我们可以用它来从ListView中获取的ScrollViewer。 我用类似这样的事情之前,使用自定义的滚动工作,我们可以在这里使用它。
public static DependencyObject GetScrollViewer(DependencyObject o)
{
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;
}
现在,我们只需要处理SelectionChanged事件。 因为我们正试图将项目滚动到列表顶部,最好的选择是滚动至底部,然后向上再滚动到我们选择的项目。 正如你所说,ScrollIntoView会,直到该项目是可见的只是滚动,因此一旦所选择的项目达到顶部,因为它滚动备份,它将停止与我们选择的项目留下我们在列表的最顶端。
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
ScrollViewer scrollViewer = GetScrollViewer(uiListView) as ScrollViewer;
scrollViewer.ScrollToBottom();
uiListView.ScrollIntoView(e.AddedItems[0]);
}
这是@rmoore的是避免滚动到页面底部的答案的替代品。 另外请注意,这仅仅是有用的情况下SelectionMode=Single
。
在情况下ScrollViewer.CanContentScroll=True
所述ScrollViewer
可以直接滚动到SelectedIndex
。
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
ScrollViewer scrollViewer = GetScrollViewer(uiListView) as ScrollViewer;
scrollViewer.ScrollToVerticalOffset(listView.SelectedIndex);
}
和在壳体ScrollViewer.CanContentScroll=False
一些额外XAML是必需的:
<ListView ScrollViewer.CanContentScroll="False" ItemsSource="{Binding Percents}" x:Name="uiListView">
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<EventSetter Event="Selected" Handler="OnSelected"/>
</Style>
</ListView.ItemContainerStyle>
</ListView>
而ScrollViewer
可以移动到垂直上方的偏移ListViewItem
。
private void OnSelected(object sender, RoutedEventArgs e)
{
ScrollViewer scrollViewer = GetScrollViewer(uiListView) as ScrollViewer;
ListViewItem listViewItem = (ListViewItem)e.Source;
Point offset = listViewItem.TranslatePoint(new Point(), scrollViewer);
scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset + offset.Y);
}