1

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

简而言之:

  • 为什么会这样
  • 帮我修一下:)
4

3 回答 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 实际上设计为仅显示采样点处的数据,而不是介于两者之间的数据。

于 2009-11-19T05:07:47.277 回答
1

ReDAeR 看看这个 http://msdn.microsoft.com/en-us/library/bb531278.aspx

于 2010-01-03T15:00:57.687 回答
0

发生这种情况的原因:WPF InkCanvas 控件在使用鼠标时每秒的输入数量有限;这意味着随着您越来越快地移动鼠标,您的触控笔输入之间的距离将越来越大。样本本身似乎在每个触控笔输入点处绘制省略号,而不是在点之间。

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

于 2009-09-21T02:29:26.777 回答