【问题标题】:Custom InkCanvas (MSDN Code Sample not working properly)自定义 InkCanvas(MSDN 代码示例无法正常工作)
【发布时间】:2009-09-14 16:05:28
【问题描述】:

我想在 InkCanvas 中使用自定义画笔。

它们是来自 MSDN 的代码 sn-p。 (http://msdn.microsoft.com/en-us/library/ms747347.aspx)

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

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

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

// Draw linear gradient ellipses between
// all the StylusPoints in the Stroke

在我看来,它应该在点之间绘制椭圆,而不仅仅是在点处。

我正在使用 C#.NET。

简而言之:

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

【问题讨论】:

    标签: c# wpf inkcanvas


    【解决方案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 通常比使用折线创建 PathGeometry 或直接在 drawingCanvas 上执行一系列 DrawLine 调用更有效。

    注意:使用更好的数字化仪并不能解决根本问题,即自定义 InkCanvas 实际上设计为仅显示采样点处的数据,而不是介于两者之间的数据。

    【讨论】:

    • 谢谢,现在可以使用了。我只需要添加一条线将这些点连接在一起。
    【解决方案2】:

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 好的,但为什么只有在我使用自定义 InkCanvas 时才会出现这种情况?常规 InkCanvas 按预期工作
      猜你喜欢
      • 1970-01-01
      • 2016-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-11
      • 2014-02-20
      相关资源
      最近更新 更多