我们正在使用FlowLayoutPanel
的自定义实现,因为.net Framework提供的实现非常慢。
因此,无论何时添加/删除控件,我们都会分别处理OnControlAdded
和OnControlRemoved
中坐标的增量重新计算。
现在,如果flowLayoutPanel.Controls.AddRange(...)
或flowLayoutPanel.Controls.clear()
被调用,则OnControlAdded
和OnControlRemoved
分别被调用多次。
在Clear()
的情况下,我们所要做的就是将4个变量设置为0,而不是为每次删除重新计算位置。我们有一个方法flowLayoutPanel.ClearControls()
,但现在面临着外部库的问题,它直接调用flowLayoutPanel.Controls.Clear()
,因为它显然不知道“我们的”实现。
不幸的是,OnControlRemoved
的ControlEventArgs
不提供任何信息,如果它是一个单一的删除,或调用已发出的Clear()
。
因此,我正在寻找一种方法,能够判断是否调用了ControlCollection.Clear()
。
目前看来,除了扩展ControlCollection
类,在Clear()
上实现一个适当的事件并从我们的FlowLayoutPanel订阅该事件之外,没有其他方法。但在走这条路之前,只是想问,也许有某种通用的CollectionChangedObserver
可以附加到flowLayoutPanel.Controls
-集合和.Remove()
和.Clear()
之间的区别?
2条答案
按热度按时间u2nhd7ah1#
在花了相当长的时间查看源代码之后,除了扩展
ControlCollection
类并添加像“ClearStarts”和“ClearEnds”这样的事件之外,还有其他方法,这样您就可以忽略中间的以下删除操作,只对ClearEnds
进行操作。gajydyqb2#
因此,我现在创建了自己的
ControlCollection
实现,并在FlowLayoutPanel
实现中使用了它。Thx到专用方法Control.ControlCollection.CreateControlsInstance
,实际上很容易“挂钩”,而不会对原始实现造成太多干扰:以及我们
FlowLayoutPanel
的相关部分: