【问题标题】:Freezing a listboxitem while items are being added在添加项目时冻结列表框项
【发布时间】:2010-03-11 21:42:19
【问题描述】:

我们有一个包含许多项目的 ListBox。项目通过 ObservableCollection 插入到 ListBox 中。其中一些项目可以直接在 ListBox 中进行编辑。但是,如果在索引

我们想做的是:如果一个项目处于编辑模式,我们想冻结它在屏幕上的位置。如果项目被添加到集合中并且项目周围的 UI 发生变化,这很好。但是项目在屏幕上的位置应该保持不变。

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

有没有人做过这样的事情并提供帮助?

【问题讨论】:

  • 我不想将此作为答案,但如果我必须这样做(并且如果您正在使用数据绑定),我会尝试的第一件事是在项目为时中断数据绑定编辑,并在编辑完成后再次设置数据上下文。

标签: c# wpf


【解决方案1】:

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

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

  2. 在 ObservableCollection.CollectionChanged 事件的处理程序中,找到您正在编辑的对象的新索引,如果索引已更改,请将已编辑的项目与现在取代它的项目交换(或其他逻辑,如果你想保持一定的顺序)。然后如果 ScrollViewer.Horizo​​ntalOffset 发生变化,将其移回所述偏移量。

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

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    您始终可以强制将项目添加到集合的末尾。否则,我认为您在滚动 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 
    

    【讨论】:

    • 非常有趣。明天我会试试这个并报告它是如何工作的。谢谢。
    【解决方案3】:

    问题是您根本不希望它移动吗?还是您通过索引号引用了该项目的问题,并且在您应用更改时索引的更改会导致其他问题(例如将它们应用于现在位于前一个索引处的项目)?

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        如果冻结列表框的其余部分是一个可行的选择。这样添加的项目直到编辑完成或转义后才会出现,然后您可以尝试使用BeginUpdateEndUpdate 来阻止重新绘制列表框。不过,我不确定这会如何影响您的编辑过程。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-06-26
          • 1970-01-01
          • 2013-06-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-30
          相关资源
          最近更新 更多