Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在添加项目时冻结listboxitem_C#_Wpf - Fatal编程技术网

C# 在添加项目时冻结listboxitem

C# 在添加项目时冻结listboxitem,c#,wpf,C#,Wpf,我们有一个列表框,其中包含许多项。项目通过ObservableCollection插入列表框。其中一些项目可以直接在列表框中编辑。但是,如果在索引

我们有一个列表框,其中包含许多项。项目通过ObservableCollection插入列表框。其中一些项目可以直接在列表框中编辑。但是,如果在索引<已编辑项目的索引处添加项目,则列表框的整个内容将下移

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

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


有人做过类似的事情并提供帮助吗?

您可以强制将物品添加到收藏的末尾。否则,我认为滚动ScrollViewer是正确的。进入“编辑模式”时,跟踪当前水平偏移


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

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


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

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


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

我认为以下方法可以解决您的问题:

  • 进入编辑模式时,保留对正在编辑的对象的引用、列表框中的索引以及ScrollViewer的水平偏移量

  • 在ObservaleCollection.CollectionChanged事件的处理程序中,找到正在编辑的对象的新索引,如果索引已更改,请将已编辑的项与现在替换它的项交换(或者,如果希望保持一定的顺序,请使用其他逻辑)。然后,如果ScrollViewer.HorizontalOffset发生更改,请将其移回所述偏移

  • 这将确保您正在编辑的项目始终保持在列表和UI中完全相同的位置


    希望这对您有所帮助。

    如果冻结列表框的其余部分是一个可行的选择,那么切换到ListView并使用EnsureRevible是否可行?

    。这样,添加的项目直到编辑完成或转义后才会显示,然后您可以尝试使用
    BeginUpdate
    EndUpdate
    停止重新绘制列表框。不过,我不确定这会对您的编辑过程产生什么影响。

    非常有趣。我明天会试试这个,然后汇报它是如何工作的。谢谢。我不想将此作为回答,但如果必须这样做(如果您使用数据绑定),我会尝试的第一件事是在编辑项目时中断数据绑定,并在编辑完成后再次设置数据上下文。