Ho 在 UWP 中将 InkCanvas 笔划保留在 InkCanvas 中

Ho to keep InkCanvas strokes inside InkCanvas in UWP

考虑 UWP 应用程序上的以下 InkCanvas,它是 Grid 中的唯一元素(为简洁起见省略)

<InkCanvas x:Name="inkCanvas" Width="500" Height="500"/>

绘制从 InkCanvas 内部某处开始的笔划,并将笔划延长到 InkCanvas 边界之外。在视觉上,您会有笔划在边界处结束的印象(例如,在 InkCanvas 的右边缘)。但是这是错误的。通过 Button 调整 InkCanvas 的大小,例如

  private void SizeButton_Click(object sender, RoutedEventArgs e)
  {
     inkCanvas.Width = 2000;
     inkCanvas.Height = 2000;
  } 

您将看到在 InkCanvas 外部绘制的笔画部分。 如果您将笔划保存为 gif 或 isf,无论是否调整大小,这部分也将可见,这是非常不幸的。 windows 商店中有几个具有墨迹书写功能的应用程序存在此问题。

问题:为什么会这样,我们该如何避免?

InkCanvas 来到现场之前,我和一个团队一起开发了墨迹软件,我们遇到了同样的问题。 "What should we do when the user drags the pen outside the rectangular region where they're allowed to ink?" 我们最终得出了与 InkCanvas 相同的结论,那就是继续前进。

做出此决定的原因是经过反复试验。

我们尝试剪裁路径,即在与边缘相交的地方将其切断。但是我们遇到了一个问题,即用户 运行 笔在框外,但随后又以相同的笔划返回。把它想象成一个签名框。我们为用户提供了一个虚线区域,他们可以在其中进行数字签名,但几乎每个人都有一个超出虚线区域边界的夸张签名。我们不能剪辑,因为我们实际上会丢失签名的重要部分。

我们还尝试将路径捕捉到边缘。当用户拖到框外时,墨迹会沿区域边缘垂直或水平对齐。至少使用这种方法,用户将获得有关拖出区域时发生的情况的即时反馈。这太可怕了。糟糕的用户体验和大量仇恨邮件。

所以...我们没有管它。该框不会以任何方式影响墨迹笔画。

现在,帮助您解决您的情况。如果要剪切路径,可以使用Win2D to convert the accumulated ink strokes to a geometry and intersect that with a rectangular geometry with the same size as your InkCanvas (500x500). If you're interested in that direction, Mike Taulty has a post about this。我唯一不确定的是,您是否可以采用最终裁剪的几何图形并将其转换回 InkStroke。这可能是一种单向操作。你得把它挖出来。