2017-05-14 69 views
1

我正在将应用程序从javascript移植到UWP c#,并且我正在努力处理新的InkCanvas。如果您熟悉UWP中的新InkCanvas,我将非常感谢您的帮助。 这是我写的代码将InkStroke渲染到Canvas上的代码。如何在UWP中使用BezierSegment在画布上渲染InkStroke C#

public static void Bezier(Canvas canvas, InkStroke stroke) 
    { 
     var segments = stroke.GetRenderingSegments(); 

     PathFigure pthFigure = new PathFigure() { StartPoint = new Point(segments[0].Position.X, segments[0].Position.Y)}; 

     for (int i = 1; i < segments.Count; i++) 
     { 
      var segment = segments[i]; 
      var bezier = new BezierSegment(); 
      bezier.Point1 = new Point(segment.BezierControlPoint1.X, segment.BezierControlPoint1.Y); 
      bezier.Point2 = new Point(segment.BezierControlPoint2.X, segment.BezierControlPoint2.Y); 
      bezier.Point3 = new Point(segment.Position.X, segment.Position.Y); 
      pthFigure.Segments.Add(bezier); 
     } 

     PathGeometry pthGeometry = new PathGeometry(); 

     pthGeometry.Figures.Add(pthFigure); 

     Path path = new Path(); 
     //path.Stroke = new SolidColorBrush(stroke.DrawingAttributes.Color); 
     //path.StrokeThickness = stroke.DrawingAttributes.Size.Height; 
     path.Stroke = new SolidColorBrush(Colors.Red); 
     path.StrokeThickness = 1; 
     path.Data = pthGeometry; 

     canvas.Children.Add(path); 
    } 

不幸的是,控制点似乎搞砸了,我不明白为什么。

您可以在下面看到我运行此代码的图像。 黑色笔划最初是在InkCanvas中渲染的,而红色笔划是从上面的代码在画布上渲染的笔触。

The black stroke is the one originally rendered in the InkCanvas, and the red stroke is the one rendered on the Canvas from the code above

任何人有什么我做错了什么想法?

+0

我测试你的代码片段在我身边,结果看起来像[这张图片](https://i.stack.imgur.com/EmB3o.png)显示。这是你期望的结果吗?我无法重现您在上图中显示的结果。你能否也请提供XAML代码以及如何调用上述方法?还有uwp应用程序版本。 –

+0

由于我动态构建XML代码,因此不容易重现,但是我发现问题!我正在设置drawingAttributes.FitToCurve = false,这导致控制点为零。我认为这个设置只影响渲染,但现在它是有道理的,因为我正在调用GetRenderingSegments。我能够通过使用GetInkPoints绘制形状,然后绘制折线。感谢您的及时回复! – ClaudiaWey

回答

1

我发现问题了!我正在设置drawingAttributes.FitToCurve = false,这导致控制点为零。我认为这个设置只影响渲染,但现在它是有道理的,因为我正在调用GetRenderingSegments。我能够通过使用GetInkPoints绘制形状,然后绘制折线。