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

在WPF ListView中自动滚动部分显示的项目,wpf,listview,scroll,Wpf,Listview,Scroll,我在WPF中有一个列表视图,我的问题是,如果某个项目部分显示,我单击该项目,列表将自动滚动,以便整个项目都可见 如何禁用此自动滚动功能 谢谢单击ListView后,它的默认行为是callBringIntoView()。您可以将事件处理程序添加到PreviewMouseDown事件中,并通过设置e.Handled=true来处理它我找到了一个解决方法,我的ListView正在MVVM中显示照片项目 private void lv_PreviewMouseDown(object sender, Mo

我在WPF中有一个列表视图,我的问题是,如果某个项目部分显示,我单击该项目,列表将自动滚动,以便整个项目都可见

如何禁用此自动滚动功能


谢谢

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

我找到了一个解决方法,我的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;
        }
    }

有同样的问题,我发现了一个问题:)

在Xaml中,使用以下EventSetter为ListViewItem定义样式:

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

希望这也适用于您:)

设置
ScrollViewer.VerticalScrollBarVisibility=“Auto”
对于帮助的列表视图。

按照Ekk的回答,您必须在子事件中处理bringIntoView事件,而不是在父列表视图中处理。 例如,在我的特殊情况下,我的listBox有一些运行时代码创建元素。这些基本上可以是文本框的stackpanel,也可以是按钮的stackpanel

尽管这些都是如何制作的,我只是补充了一点

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

对于每一个事件,其效果是,单击后,它们没有进入视图,但与它们关联的操作立即被执行。

您是否有事件处理程序订阅此事件,或者您需要使用它执行其他操作?我只需要ListView像往常一样工作,只是我需要删除此BringIntoView行为此行为总是在引发click事件后发生。你必须选择。另一种可能的方法是创建一个自定义控件并覆盖
OnPreviewMouseDown
。总体而言:这是唯一的方法,捕获PreviewMouseDown并执行您喜欢的操作:)在我的情况下,我希望项目滚动到视图中,但我希望它被选中。在我的处理程序中,我只是设置了新的选择,并保留e.handled=false。很好!完美的正是我想要的:-)
btnOk.RequestBringIntoView += (s,e) => { e.Handled = true; };