Scrollviewer向下滚动

时间:2019-09-05 15:04:46

标签: c# wpf listbox devexpress scrollviewer

我遇到ListBox(普通WPF,System.Windows.Controls.ListBox)本身包含ListBox(也为普通WPF)的项目的问题。在我的生产应用程序(使用DevExpress控件)中,创建外部ListBox后,它立即向下滚动(但仍可见),以便最后一个内部ListBox中的第一项可见。

我试图用一个没有DevExpress的最小应用程序和一个使用DevExpress的应用程序来重现这种行为。均未显示该行为。

我在(外部)ScrollChanged的{​​{1}}的{​​{1}}的{​​{1}}上附加了一个处理程序,我看到了导致滚动的事件,但是我无法弄清楚它的位置

旁注:如果我将ScrollViewer之一(无论内部还是外部)做成DevExpress-ListBox,则滚动问题就消失了。但是,我无法做到这一点,因为当我单击项目时,我得到ListBox的关于枚举期间集合更改的信息。而且我仍然不需要ListBoxEdit功能。

第二条旁注:我尝试删除外部InvalidOperationExceptionListBoxEdit)的主题,但没有效果。

所以问题是我如何找出导致滚动的原因(以防止他这样做)?

更新:将焦点放在外部列表框的第一项上并没有任何改变。

更新:订阅ListBox并设置ThemeManager.ThemeName="None"就可以解决问题,但前提是我要闯入那里。没有断点,它什么也不做。 stacktrace本身什么也没告诉我:

RequestBringIntoView

2 个答案:

答案 0 :(得分:0)

您可以通过将ScrollViewer的控件模板更改为更简单的方法来将其从ListBox中删除:

<ListBox>
    <ListBox.Template>
        <ControlTemplate>
            <ItemsPresenter />
        </ControlTemplate>
    </ListBox.Template>
    ...
</ListBox>

但是,我质疑嵌套ListBoxes的价值。请记住,每个列表框都是一个选择器,并且具有“选择”哪个项目的概念。在选定项目内,选定项目内有选定项目真的有意义吗?

我建议将“内部”列表框更改为简单的ItemsControl,以使嵌套列表不能选择项目。这将使用户体验变得更加简单。您可能仍需要以相同的方式重新设计内部的ItemsControl,以删除滚动条,但至少用户不会对“选择”哪个项目感到困惑。

答案 1 :(得分:0)

您可以通过阻止ListBoxItem的RequestBringIntoView事件来阻止自动滚动。

<ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                <EventSetter Event="RequestBringIntoView" Handler="ListBoxItem_RequestBringIntoView"/>
            </Style>
        </ListBox.ItemContainerStyle>

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