Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自定义InkCanvas(MSDN代码示例无法正常工作)_C#_Wpf_Inkcanvas - Fatal编程技术网

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

C# 自定义InkCanvas(MSDN代码示例无法正常工作),c#,wpf,inkcanvas,C#,Wpf,Inkcanvas,我想在InkCanvas中使用自定义笔刷 它们是来自MSDN的代码片段。() 如果我使用该代码并快速移动鼠标,我会在画笔之间获得空间(椭圆): 我的问题当然是如何解决这个问题,但我也很好奇为什么会发生这种情况(我想从中学习),我认为可能我做错了什么,但即使我剪切/粘贴了正在发生的示例 阅读代码时我注意到的一点是CustomStroke类中的注释 // Draw linear gradient ellipses between // all the StylusPoints in the Str

我想在InkCanvas中使用自定义笔刷

它们是来自MSDN的代码片段。()

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

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

阅读代码时我注意到的一点是CustomStroke类中的注释

// Draw linear gradient ellipses between
// all the StylusPoints in the Stroke
在我看来,它应该在点之间画椭圆,而不仅仅是在点上

我正在使用C#NET

简而言之:

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

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


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

为什么会发生这种情况

示例中的自定义InkCanvas在每个收集的笔划点绘制椭圆,但不尝试在它们之间绘制直线。标准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 ...
//绘制连接线
var geo=新的StreamGeometry();
使用(geoContext=geo.Open())
{
geoContext.StartFigure(stylusPoints[0],false,false);
PolyLineTo(stylusPoints.Skip(1.Cast(),true,false);
}
drawingContext.DrawGeometry(null,ConnectionLinePen,geo);
//画椭圆
对于(int i=1;i
此代码的工作原理是构造多段线StreamGeometry,然后将其绘制到上下文中。在此上下文中使用StreamGeometry通常比使用多段线创建PathGeometry或直接在drawingCanvas上执行一系列DrawLine调用更有效

注意:使用更好的数字化仪无法解决根本问题,即定制InkCanvas实际上设计为仅显示采样点处的数据,而不是采样点之间的数据。

ReDAeR 看这个

好的,但为什么只有在我使用自定义InkCanvas时才会发生这种情况?常规InkCanvas的工作原理与预期一致谢谢,它现在正在工作。我只需要添加一条线将点连接在一起。