自定义InkCanvas(MSDN代码示例无法正常工作)

时间:2009-09-14 16:05:28

标签: c# wpf inkcanvas

我想在InkCanvas中使用自定义画笔。

他们是来自MSDN的代码片段。 (http://msdn.microsoft.com/en-us/library/ms747347.aspx

如果我使用该代码并快速移动我的鼠标,我会在画笔(椭圆)之间获得空间: Screenshot

我的问题当然是如何解决这个问题,但我也很好奇为什么会发生这种情况(我想从中学习)我想也许我做错了什么但即使我剪切/粘贴了这个例子它也在发生。

在阅读代码时我注意到的一件小事是CustomStroke类中的这个注释

// Draw linear gradient ellipses between
// all the StylusPoints in the Stroke

在我看来,它不仅应该在点之间绘制椭圆。

我正在使用C#.NET。

简而言之:

  • 为什么会这样?
  • 帮帮我解决它:)

3 个答案:

答案 0 :(得分:1)

为什么会这样?

示例中的自定义InkCanvas在每个收集的StrokePoint上绘制一个椭圆,但不会尝试在它们之间绘制线条。标准InkCanvas控件是通过在给定点之间绘制线条来实现的。这就是为什么示例中的自定义InkCanvas实现留下了空白而内置的实现没有。

如何“修复”

自定义代码可以很容易地扩展到不留空隙:除了在每个点绘制椭圆之外,它还可以在每对点之间绘制线条。

在绘制省略号的代码之前可能会添加绘制连接线的代码,如下所示:

// Draw connecting lines
var geo = new StreamGeometry();
using(geoContext = geo.Open())
{
  geoContext.StartFigure(stylusPoints[0], false, false);
  geoContext.PolyLineTo(stylusPoints.Skip(1).Cast<Point>(), true, false);
}
drawingContext.DrawGeometry(null, connectingLinePen, geo);

// Draw ellipses
for(int i = 1; i < stylusPoints.Count; i++)
{
  ... etc ...

此代码通过构造折线StreamGeometry然后将其绘制到上下文来工作。在此上下文中使用StreamGeometry通常比使用Polyline创建PathGeometry或直接在drawingCanvas上执行一堆DrawLine调用更有效。

注意:使用更好的数字化仪无法解决根本问题,即自定义InkCanvas实际上只是为了在采样点而不是在两者之间显示数据。

答案 1 :(得分:1)

答案 2 :(得分:0)

为什么会发生这种情况:使用鼠标时,WPF InkCanvas控件的每秒输入数量有限;这意味着当您越来越快地移动鼠标时,您的手写笔输入将在它们之间具有越来越大的距离。样本本身似乎在每个触笔输入点处绘制椭圆,而不是在点之间绘制。

如何解决这个问题:使用平板电脑 - 像平板电脑这样的数字转换器每秒输入数量要高得多,因此更难以遇到或填补空白 - 基本上是根据以前的点数进行估算,也许是一条bezier曲线。