在WPF ListView中部分显示项目的恼人的自动滚动

时间:2012-10-17 06:25:14

标签: wpf listview scroll

我在 WPF 中有一个 ListView ,我的问题是如果某个项目已部分显示并且我点击了该项目,该列表将自动滚动,因此整个项目将是可见。

如何停用此自动滚动功能?

谢谢

5 个答案:

答案 0 :(得分:12)

有同样的问题,我发现了一个闷闷不乐的事情:)。

在Xaml中,您使用此EventSetter为ListViewItem定义样式:

<ListView.ItemContainerStyle>
    <Style TargetType="{x:Type ListViewItem}">
         <EventSetter Event="RequestBringIntoView" Handler="ProjectListView_OnRequestBringIntoView"/>
    </Style>
</ListView.ItemContainerStyle>
代码背后的

private void ProjectListView_OnRequestBringIntoView(object sender, RequestBringIntoViewEventArgs e)
{
    e.Handled = true;
}

希望这也适合你:)

答案 1 :(得分:1)

ListView的默认行为是在单击后调用BringIntoView()。您可以向PreviewMouseDown事件添加事件处理程序,并通过设置e.Handled = true;来处理它。

答案 2 :(得分:1)

我发现了一个解决方法,我的ListView正在MVVM中显示照片项目

private void lv_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        var p=e.OriginalSource as FrameworkElement;
        if (p != null && p.DataContext is **Photo**)
        {
            lv.SelectedItem = p.DataContext;
            e.Handled = true;
        }
    }

答案 3 :(得分:0)

按照Ekk的回答,您必须在父级listView上而不是在子级事件中处理BringIntoView事件。 例如,在我的特例中,我的listBox有一些运行时代码创建元素。这些基本上可以是文本框的堆栈面板,或者最后是按钮的堆栈面板。

enter image description here

尽管我只是添加了这些内容,但是

btnOk.RequestBringIntoView += (s,e) => { e.Handled = true; };

对每一个按钮的作用是,单击后它们没有被看到,但是与它们每个按钮相关联的动作立即被执行。

答案 4 :(得分:-2)

为列表视图设置ScrollViewer.VerticalScrollBarVisibility="Auto"有帮助。