当前位置: 首页 > 编程语言 > C#

WPFListbox虚拟化创建DisconnectedItems分享

时间:2023-04-11 11:44:18 C#

WPFListbox虚拟化创建DisconnectedItems我正在尝试使用WPFListBox创建一个Graph控件。我创建自己的Canvas,它来自VirtualizingPanel,我自己处理项目的实体化和虚拟化。然后将列表框的项目面板设置为我的自定义虚拟画布。我遇到的问题发生在以下情况中:是什么导致创建此“DisconnectedItem”?如果我先虚拟B,然后虚拟A,则不会创建此项目。我的理论是虚拟化列表框中其他项目之前的项目会导致子项目断开连接。对于包含数百个节点的图形,问题更加明显,因为我在平移时最终得到数百个断开连接的项目。以下是canvas代码的一部分://////显式排列和虚拟化子元素定位。///publicclassVirtualizingCanvas:VirtualizingPanel{(...)protectedoverrideSizeMeasureOverride(Sizeconstraint){ItemsControlitemsOwner=ItemsControl.GetItemsOwner(this);}//出于某种原因,您必须“触摸”子集合//以便ItemContainerGenerator正确初始化。varnecessaryChidrenTouch=儿童;IItemContainerGeneratorgenerator=ItemContainerGenerator;IDisposablegenerationAction=null;整数索引=0;RectvisibilityRect=newRect(-Horizo??ntalOffset/ZoomFactor,-VerticalOffset/ZoomFactor,ActualWidth/ZoomFactor,ActualHeight/ZoomFactor);//遍历项目列表并生成它们的容器//如果它们包含在当前可见视图中。foreach(itemsOwner.Items中的对象项目){varvirtualizedItem=itemasIVirtualizingCanvasItem;if(virtualizedItem==null||visibilityRect.IntersectsWith(GetBounds(virtualizedItem))){if(generationAction==null){GeneratorPositionstartPosition=generator.GeneratorPositionFromIndex(index);generationAction=generator.StartAt(startPosition,GeneratorDirection.Forward,true);}GenerateItem(索引);}else{GeneratorPositionitemPosition=generator.GeneratorPositionFromIndex(index);如果(itemPosition.Index!=-1&&itemPosition.Offset==0){RemoveInternalChildRange(index,1);generator.Remove(itemPosition,1);}//当我们跳过序列中的某些项目时,生成器需要“重置”//...if(generationAction!=null){generationAction.Dispose();generationAction=null;}}++索引;}if(generationAction!=null){generationAction.Dispose();}返回默认值(大小);}(...)privatevoidGenerateItem(intindex){boolnewlyRealized;varelement=ItemContainerGenerator.GenerateNext(outnewlyRealized)asUIElement;if(newlyRealized){if(index>=InternalChildren.Count){AddInternalChild(元素);}else{InsertInternalChild(index,element);}ItemContainerGenerator.PrepareItemContainer(元素);element.RenderTransform=_scaleTransform;}element.Measure(newSize(double.PositiveInfinity,double.PositiveInfinity));每当从可视化树中删除容器时都会使用它,因为相应的项目已被删除,或者集合已被刷新,或者容器已从屏幕上滚动并重新虚拟化这是WPF4中的一个已知错误已知错误,请参阅此链接,它还有一个您可以应用的解决方法。编辑:“您可以通过在第一次看到标记对象{DisconnectedItem}时保存对标记对象的引用,然后与之后保存的值进行比较来使解决方案更加健壮。我们应该有一种公共方式来测试{DisconnectedItem},但它已经从裂缝中溜走了。我们将在未来的版本中解决这个问题,但现在你可以指望拥有一个独特的{DisconnectedItem}对象。”以上全部由C#学习教程:WPFListbox虚拟化创建DisconnectedItems分享,如果内容对您有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢