在添加项目时冻结listboxitem

时间:2010-03-11 21:42:19

标签: c# wpf

我们有一个包含许多项目的ListBox。项目通过ObservableCollection插入ListBox。其中一些项目可以在ListBox中进行编辑。但是,如果在索引处添加项目<在编辑项目的索引中,ListBox的整个内容向下移动。

我们想要做的是:如果某个项目处于编辑模式,我们想要冻结它在屏幕上的位置。如果将项目添加到集合并且项目周围的UI发生更改,则可以。但是项目的位置应该在屏幕上保持不变。

我到目前为止唯一能做的就是附加到ScrollChanged事件,并且最多使用BringIntoView或ScrollIntoView方法来确保项目始终显示在UI中的某个位置,但我无法锁定其位置。

有没有人做过这样的事情并帮忙?

5 个答案:

答案 0 :(得分:1)

我认为以下内容可以解决您的问题:

  1. 进入编辑模式时,请保留对您正在编辑的对象,列表框中的索引以及ScrollViewer的Horizo​​ntalOffset的引用。

  2. 在ObservableCollection.CollectionChanged事件的处理程序中,找到您编辑的对象的新索引,如果索引已更改,则将已编辑的项目与现在使用的项目交换(或者如果您想要的话,还可以使用其他逻辑保持一定的秩序)。然后,如果ScrollViewer.Horizo​​ntalOffset发生了变化,请将其移回所述偏移量。

  3. 这将确保您正在编辑的项目始终位于列表和用户界面中的完全相同的位置。

    希望这可以帮到你。

答案 1 :(得分:0)

您可以随时强制将项目添加到集合的末尾。否则,我认为您在滚动ScrollViewer时走在正确的轨道上。进入“编辑模式”时,跟踪当前的水平偏移。


 ScrollViewer sv = listBox.GetScrollViewer();
 double indexPos =  sv.HorizontalOffset;

但是,我认为你最好不要附加到ObservableCollection.CollectionChanged事件。当事件触发时,检查新值是否已插入“编辑模式”项目上方。如果是,则运行以下代码。


 ScrollViewer sv = listBox.GetScrollViewer();
 sv.ScrollToHorizontalOffset(indexPos+1); // This will obviously require an offset 

答案 2 :(得分:0)

问题是你根本不想让它移动吗?或者是您通过索引编号引用该项目的问题,并且索引更改在应用更改时会导致其他问题(例如将它们应用于现在位于上一个索引的项目)?

如果问题是索引更改导致代码出现问题,那么我将停止使用索引,而是获取对该对象的引用。如果您发现需要,您可以随时获取该项目的索引。

答案 3 :(得分:0)

切换到ListView是否可行,并使用EnsureVisible?

答案 4 :(得分:0)

如果冻结列表框的其余部分是可行的选择。这样添加的项目在编辑完成或转义之后才会显示,然后您可以尝试使用BeginUpdateEndUpdate来停止重新绘制ListBox。我不确定这会对你的编辑过程产生什么影响。