WPF代码后置中椭圆沿路径移动无效果,求问题排查
问题分析与修正
你的代码里椭圆不移动的核心问题是动画目标对象注册错误,还有几处可优化的细节,具体如下:
1. 核心错误:注册了错误的对象到命名作用域
你当前把椭圆对象注册成了shapeMatrixTransform,但动画的目标是椭圆绑定的MatrixTransform实例,不是椭圆本身:
' 错误代码 SchematicDiagram.RegisterName("shapeMatrixTransform", newellipse)
修正为:注册shapeMatrixTransform这个变换对象:
SchematicDiagram.RegisterName("shapeMatrixTransform", shapeMatrixTransform)
2. 可选优化:简化PathGeometry的创建
你新建FlowPathGeometry并添加OrPath.Data的步骤可以简化,因为Geometry.Parse(sData)返回的如果是PathGeometry,直接赋值即可:
' 原代码 FlowPathGeometry = New PathGeometry FlowPathGeometry.AddGeometry(OrPath.Data) FlowPathGeometry.Freeze() ' 简化后 FlowPathGeometry = TryCast(Geometry.Parse(sData), PathGeometry) If FlowPathGeometry IsNot Nothing Then FlowPathGeometry.Freeze() End If
如果sData是标准路径语法,Geometry.Parse会直接返回PathGeometry,这样更高效。
3. 可选:按需设置路径旋转行为
如果需要椭圆沿路径切线方向旋转,可以显式设置MatrixAnimationUsingPath的属性,默认不旋转:
ma.DoesRotateWithTangent = True ' 设为True则椭圆随路径切线旋转
修正后的关键代码片段
' 创建椭圆和变换 Dim shapeMatrixTransform As New MatrixTransform() Dim newellipse As New Ellipse newellipse.Name = "FlowPathCircle" newellipse.Fill = Brushes.Blue newellipse.Height = 5 newellipse.Width = 5 newellipse.RenderTransform = shapeMatrixTransform SchematicDiagram.Children.Add(newellipse) ' 设置命名作用域并注册正确的变换对象 NameScope.SetNameScope(SchematicDiagram, New NameScope()) SchematicDiagram.RegisterName("shapeMatrixTransform", shapeMatrixTransform) ' 创建路径动画 Dim ma As New Animation.MatrixAnimationUsingPath() ma.Duration = TimeSpan.FromSeconds(5) ma.RepeatBehavior = Media.Animation.RepeatBehavior.Forever ma.PathGeometry = FlowPathGeometry ' 设置动画目标 Media.Animation.Storyboard.SetTargetName(ma, "shapeMatrixTransform") Media.Animation.Storyboard.SetTargetProperty(ma, New PropertyPath(MatrixTransform.MatrixProperty)) ' 启动故事板 Dim pathAnimationStoryboard As New Animation.Storyboard pathAnimationStoryboard.Children.Add(ma) pathAnimationStoryboard.Begin(SchematicDiagram)
修改后椭圆即可沿路径正常移动。
内容的提问来源于stack exchange,提问作者HydroGuy
相关产品推荐
相关产品推荐

