在UWP项目中能否用SkiaSharp结合Surface Pen绘制Bing Maps多边形叠加层?
可行性分析:UWP中用SkiaSharp+Surface Pen替代Win2D+Bing Maps绘制多边形叠加层
完全可行!而且这其实是个相当不错的方案——既能借助SkiaSharp的跨平台能力,又能完美适配Surface Pen的手写输入。下面给你拆解下可行性原因和实现要点:
核心可行性依据
- SkiaSharp对UWP的原生支持:官方提供了
SkiaSharp.Views.UWPNuGet包,能无缝集成到UWP项目中。它自带SKXamlCanvas这类控件,可以直接嵌入XAML布局,不管是放到Bing Maps的MapLayer里,还是作为透明层叠加在地图上方,都不会影响地图的交互功能。 - Surface Pen输入轻松对接:UWP本身的指针事件(
PointerPressed/PointerMoved/PointerReleased)完全支持Surface Pen的输入,包括压力、倾斜度这些数据。你可以捕捉这些事件,把笔的屏幕坐标转换成SkiaSharp画布的坐标,实时构建多边形路径。 - SkiaSharp的绘制能力不输Win2D:SkiaSharp的
SKCanvasAPI提供了全套2D绘制工具,比如DrawPolygon、FillPolygon,还能自定义笔触颜色、宽度、填充样式,完全能替代Win2D实现多边形叠加层的所有功能,甚至能做得更灵活。
关键实现步骤
- 引入依赖包:安装
SkiaSharp和SkiaSharp.Views.UWP两个NuGet包,注意版本要和你的UWP项目目标框架兼容(最新版本基本支持Windows 10 1809及以上)。 - 集成SkiaSharp与Bing Maps:在Bing Maps的
MapControl上方叠加一个透明的SKXamlCanvas,或者把它放到MapLayer里,这样既能绘制多边形,又不影响地图的缩放、拖拽等交互。 - 处理Surface Pen输入:
- 给
SKXamlCanvas绑定指针事件,用SKXamlCanvas.ConvertPixelToCanvas方法把笔的屏幕坐标转换成SkiaSharp画布的坐标。 - 在
PointerPressed时初始化一个新的多边形路径,PointerMoved时实时添加路径点实现预览,PointerReleased时完成多边形绘制并保存路径。
- 给
- 渲染多边形:在
SKXamlCanvas.PaintSurface事件中,用SKCanvas的API绘制所有已保存的多边形,同时也能在这里渲染正在绘制的路径,实现实时预览效果。
重要注意事项
- 坐标映射问题:Bing Maps用的是经纬度地理坐标,而SkiaSharp用的是画布像素坐标,你需要做两者的转换。可以借助Bing Maps的
MapControl.LocationToPoint方法,把经纬度转换成屏幕像素坐标,再转成SkiaSharp的画布坐标。 - 性能优化:如果要绘制大量多边形,建议把它们批量放到一个
SKPath里,减少重绘次数。SkiaSharp默认开启硬件加速,但可以确认下SKXamlCanvas的渲染模式,确保性能最优。 - 利用Surface Pen特性:如果需要用到笔的压力感应,可以根据指针事件里的压力值动态调整
SKPaint.StrokeWidth,让绘制体验更接近真实手写。
内容的提问来源于stack exchange,提问作者Karlitos2312
相关产品推荐
相关产品推荐

