我们有一个包含许多项目的ListBox.项目通过ObservableCollection插入ListBox.其中一些项目可以在ListBox中进行编辑.但是,如果在索引<已编辑项目的索引处添加项目,则ListBox的整个内容将向下移动.
我们想要做的是:如果某个项目处于编辑模式,我们想要冻结它在屏幕上的位置.如果将项目添加到集合并且项目周围的UI发生更改,则可以.但是项目的位置应该在屏幕上保持不变.
到目前为止我唯一能做的就是附加到ScrollChanged事件,并且最多使用BringIntoView或ScrollIntoView方法来确保项目始终显示在UI中的某个位置,但是我无法锁定它位置.
有没有人做过这样的事情并帮忙?
您始终可以强制将项目添加到集合的末尾。否则,我认为您滚动 ScrollViewer 的方向是正确的。进入“编辑模式”时,跟踪当前的水平偏移。
ScrollViewer sv = listBox.GetScrollViewer();
double indexPos = sv.HorizontalOffset;
Run Code Online (Sandbox Code Playgroud)
但是,我认为您最好附加到 ObservableCollection.CollectionChanged 事件。当事件触发时,检查新值是否插入到“编辑模式”项目上方。如果是,则运行以下代码。
ScrollViewer sv = listBox.GetScrollViewer();
sv.ScrollToHorizontalOffset(indexPos+1); // This will obviously require an offset
Run Code Online (Sandbox Code Playgroud)