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

141是WPF面板同时动画的最大数量吗?分享

时间:2023-04-10 16:50:21 C#

141最多可以同时动画的WPF面板项数是多少?我用C#设计了几个动画面板,它们都继承自一个基类,该基类在Panel.Children上执行实际动画。直到最近,它们都完美无缺地工作……但最近,我正在使用一个包含大量项目的集合,并且我开始出现一些奇怪的视觉错误。当应用程序首次加载项目时,前x个项目正确显示,然后其余的都显示在第一个位置(彼此重叠)。如果我调整窗口大小或选择一个项目,它们都会重新排列以正确显示。(使用下面的示例代码,您必须调整窗口大小才能看到它们自己正确。)经过大量讨论和调试,我发现正确的值仍然是每个项目的动画代码,但最后一个x项目根本没有动画。每个项目肯定会通过动画代码,但最后x个项目保留在动画Panel.ArrangeOverride方法中设置的位置。为了尝试在我的代码中找到问题,我创建了一个新的UserControl和AnimatedPanel类,其中包含重新创建问题所需的最少代码。这样做之后,我很惊讶问题仍然可以重现。在我的示例代码中有141项,问题没有显示出来,但它不再显示问题了。请原谅冗长的代码行,但有很多东西要展示。AnimatedStackPanel.cs类publicclassAnimatedStackPanel:Panel{protectedoverrideSizeMeasureOverride(SizeavailableSize){doublex=0,y=0;foreach(UIElementchildinChildren){child.Measure(availableSize);x=Math.Max(x,availableSize.Width==double.PositiveInfinity?child.DesiredSize.Width:availableSize.Width);y+=child.DesiredSize.Height;}returnnewSize(availableSize.Width==double.PositiveInfinity?x:availableSize.Width,availableSize.Height==double.PositiveInfinity?y:availableSize.Height);}protectedoverrideSizeArrangeOverride(SizefinalSize){if(this.Children==null||this.Children.Count==0)returnfinalSize;大小previousChildSize=newSize();PointendPosition=newPoint(0,0);foreach(UIElementchildinChildren){endPosition.Y+=previousChildSize.Height;双childWidth=finalSize.Width;child.Arrange(newRect(0,0,childWidth,child.DesiredSize.Height));点startPosition=newPoint(endPosition.X,endPosition.Y+finalSize.Height);AnimatePosition(child,startPosition,endPosition,newTimeSpan(0,0,1));previousChildSize=child.DesiredSize;}返回最终大小;}privatevoidAnimatePosition(UIElementchild,PointstartPosition,PointendPosition,TimeSpananimationDuration){DoubleAnimationxAnimation=newDoubleAnimation(startPosition.X,endPosition.X,animationDuration);DoubleAnimationyAnimation=newDoubleAnimation(startPosition.Y,endPosition.Y,animationDuration);TransformGrouptransformGroup=child.RenderTransformasTransformGroup;if(transformGroup==null){TranslateTransformtranslatationTransform=newTranslateTransform();transformGroup=newTransformGroup();transformGroup.Children.Add(translatationTransform);child.RenderTransform=transformGroup;child.RenderTransformOrigin=newPoint(0,0);}TranslateTransformtranslateTransform=(TranslateTransform)transformGroup.Children[0];翻译机ansform.BeginAnimation(TranslateTransform.XProperty,xAnimation,HandoffBehavior.Compose);translateTransform.BeginAnimation(TranslateTransform.YProperty,yAnimation,HandoffBehavior.Compose);//child.Arrange(newRect(endPosition.X,endPosition.Y,child.DesiredSize.Width,child.DesiredSize.Height));}}AnimatedListBox.xamlUserControlAnimatedListBox.xaml.cs后面的UserControl代码publicpartialclassAnimatedListBox:UserControl{publicAnimatedListBox(){InitializeComponent();数据=新的ObservableCollection();//将下面的150更改为小于142的值,问题就消失了!!for(intcount=1;count<=150;count++)Data.Add(count);数据上下文=这个;}publicstaticDependencyPropertyDataProperty=DependencyProperty.Register("Data",typeof(ObservableCollection),typeof(AnimatedListBox));公共ObservableCollection数据{get{return(ObservableCollection)GetValue(DataProperty);}set{设置值(Data属性,值);}}}在试验的过程中,我发现了其他一些看似奇怪的事情如果我将Panel.ArrangeOverride方法中项目的位置更改为以下内容,我会得到更多意想不到的结果。child.Arrange(newRect(endPosition.X,endPosition.Y,childWidth,child.DesiredSize.Height));这会以某种方式改变实际(动画)结束位置,即。该项目最终将位于何处。它引入了某种双倍行距项目。在开始动画之前将项目安排到其最终位置如何改变其最终结束位置?我错过了一些明显的东西吗?此外,如果您取消注释AnimatedStackPanel.AnimatePosition方法中的注释行并注释掉上面的两行(即剪切动画并将项目直接移动到动画将它们移动到的相同结束位置),那么您将看到问题又消失了......无论集合中有多少项目,这都适用。这就是为什么我认为问题与动画有关。我发现的最后一件事是项目数据类型存在问题,无论是否使用DataTemplate......我很确定它与动画有关。如果有人能看到我做错了什么,或者找到解决方案,我将不胜感激,因为这让我感到困惑。有人甚至可以用示例代码重现这个问题吗?先感谢您。Sheridan,我试过你的代码示例,我发现当你应用RenderTransform时它显然很重要。我没有在AnimatePosition中分配它,即在ArrangeOverride的第一次运行期间,而是将代码移动到MeasureOverride:protectedoverrideSizeMeasureOverride(SizeavailableSize){doublex=0,y=0;foreach(UIElementchildinChildren){TransformGrouptransformGroup=child.RenderTransformasTransformGroup;if(transformGroup==null){TranslateTransformtranslationTransform=newTranslateTransform();transformGroup=newTransformGroup();transformGroup.Children.Add(translatationTransform);child.RenderTransform=transformGroup;child.RenderTransformOrigin=newPoint(0,0);}child.Measure(availableSize);x=Math.Max(x,availableSize.Width==double.PositiveInfinity?child.DesiredSize.Width:availableSize.Width);y+=孩子。DesiredSize.Height;}returnnewSize(availableSize.Width==double.PositiveInfinity?x:availableSize.Width,availableSize.Height==double.PositiveInfinity?y:availableSize.Height);现在,即使在第一次调用ArrangeOverride时,动画也会按预期工作。看起来最后几个RenderTransforms没有附加到控件,但已经设置了动画。BTW,在运行Windows732位的两个不同系统(双核和四核)上,最大数量是144。以上是C#学习教程:Is141theMaximumnumberofWPFpanelitemsthatcanbeanimatedsimultaneous?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: