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

问题描述 投票:1回答:3

我想在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。

简而言之:

  • 为什么会这样呢?
  • 帮帮我解决:)
c# wpf inkcanvas
3个回答
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
投票

ReADeR看看这个qazxsw poi


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.