【问题标题】:Is there an equivalent for WPF's Geometry.Data.GetFlattenedGeometry in UWP?UWP 中是否有 WPF 的 Geometry.Data.GetFlattenedGeometry 的等价物?
【发布时间】:2017-10-11 15:31:24
【问题描述】:

有没有办法在 UWP 应用程序中沿 Path 几何图形找到 x% 的 Point?在 WPF 中,这可以使用:

var path = new Path { Data = Geometry.Parse(svgLikePathString) };
var flattened = path.Data.GetFlattenedGeometry();

// e.g. x = 0.5 for 50% along the path
flattened.GetPointAtFractionLength(x, out Point point, out Point tangent);

上下文 我正在将基于 WPF 的应用程序转换为 UWP,我可以在其中显示来自同一点数组的不同路径,有点像 https://bl.ocks.org/mbostock/4342190。在 UWP 中,我可以使用this approach 替换Geometry.Parse(string),但是Geometry 上不再存在path.Data.GetFlattenedGeometry() 和GetPointAtFractionLength()。

【问题讨论】:

  • UWP 不支持GetFlattenedGeometry() 和GetPointAtFractionLength()。您可以考虑直接通过Desktop Bridge 将您的 WPF 应用程序转换为 UWP。
  • 谢谢。是的,在这个阶段,我已经设法使用 SkiaSharp 进行路径操作获得了一个可行的解决方案。我认为这将是我的解决方案。

标签: c# uwp


【解决方案1】:

由于某种原因,UWP 上的路径检查功能已被删除。我已经设法使用 SkiaSharp 拼凑出一个解决方案(我也考虑过 Win2D,但 SkiaSharp 支持更多平台)。

在我之前使用GetFlattenedGeometry 的路径生成代码中,我执行以下操作:

// using SkiaSharp;

var path = SKPath.ParseSvgPathData(mySvgLikePathString);
var measure = SKPathMeasure(path);    
var pathLength = measure.Length;

// get the position and tangent half way along the path
measure.GetPositionAndTangent(0.5 * pathLength, out SKPoint pos, out SKPoint tangent);

// do some magic to generate the SVG-like path in here and return the string representation
return GenerateSuperSpecialPath(path, pos, tangent); 

一旦我有了路径字符串,我就可以将它放入我的 ViewModel 并绑定到模板中:

<Path Data={Binding MyPathString, Converter={StaticResource StringToGeometryConverter}} />

转换器如下所示:

public class StringToGeometryConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        var pathStr = "<Geometry xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">" + (string)value + "</Geometry>";
        return (Geometry)XamlReader.Load(pathStr);
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new InvalidOperationException("Cannot convert from Geometry to string");
    }
}

可能不是最高效的解决方案,但它可以工作,并且在绘制路径时我没有注意到任何严重的延迟。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-02
    • 2020-07-10
    • 2011-05-29
    • 2014-01-04
    • 2016-06-08
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多