我遇到ListBox
(普通WPF,System.Windows.Controls.ListBox
)本身包含ListBox
(也为普通WPF)的项目的问题。在我的生产应用程序(使用DevExpress控件)中,创建外部ListBox
后,它立即向下滚动(但仍可见),以便最后一个内部ListBox
中的第一项可见。
我试图用一个没有DevExpress的最小应用程序和一个使用DevExpress的应用程序来重现这种行为。均未显示该行为。
我在(外部)ScrollChanged
的{{1}}的{{1}}的{{1}}上附加了一个处理程序,我看到了导致滚动的事件,但是我无法弄清楚它的位置
旁注:如果我将ScrollViewer
之一(无论内部还是外部)做成DevExpress-ListBox
,则滚动问题就消失了。但是,我无法做到这一点,因为当我单击项目时,我得到ListBox
的关于枚举期间集合更改的信息。而且我仍然不需要ListBoxEdit
功能。
第二条旁注:我尝试删除外部InvalidOperationException
(ListBoxEdit
)的主题,但没有效果。
所以问题是我如何找出导致滚动的原因(以防止他这样做)?
更新:将焦点放在外部列表框的第一项上并没有任何改变。
更新:订阅ListBox
并设置ThemeManager.ThemeName="None"
就可以解决问题,但前提是我要闯入那里。没有断点,它什么也不做。 stacktrace本身什么也没告诉我:
RequestBringIntoView
答案 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;
}