我想在InkCanvas中使用自定义画笔。
他们是来自MSDN的代码片段。 (http://msdn.microsoft.com/en-us/library/ms747347.aspx)
如果我使用该代码并快速移动我的鼠标,我会在画笔(椭圆)之间获得空间:
我的问题当然是如何解决这个问题,但我也很好奇为什么会发生这种情况(我想从中学习)我想也许我做错了什么但即使我剪切/粘贴了这个例子它也在发生。
在阅读代码时我注意到的一件小事是CustomStroke类中的这个注释
// Draw linear gradient ellipses between
// all the StylusPoints in the Stroke
在我看来,它不仅应该在点之间绘制椭圆。
我正在使用C#.NET。
简而言之:
答案 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曲线。