我在这个网站上使用其他答案时遇到了困难,希望这能帮助其他人。
想法是任何控件都有一个可重写的渲染方法。此方法可以调用context.Custom
,该方法接受一个ICustomDrawOperation
实例。我的理解是Skia渲染不能保证,因此代码需要检查并转换为ISkiaDrawingContextImpl
。
对于那些只想要放置一些东西的人(就像我一样),这里有一些应该有所帮助的代码:
public partial class SkiaCanvas : UserControl
{
class RenderingLogic : ICustomDrawOperation
{
public Action<SKCanvas> RenderCall;
public Rect Bounds { get; set; }
public void Dispose() {}
public bool Equals(ICustomDrawOperation? other) => other == this;
public bool HitTest(Point p) { return false; }
public void Render(IDrawingContextImpl context)
{
var canvas = (context as ISkiaDrawingContextImpl)?.SkCanvas;
if(canvas != null)
{
Render(canvas);
}
}
private void Render(SKCanvas canvas)
{
RenderCall?.Invoke(canvas);
}
}
RenderingLogic renderingLogic;
public event Action<SKCanvas> RenderSkia;
public SkiaCanvas()
{
InitializeComponent();
renderingLogic = new RenderingLogic();
renderingLogic.RenderCall += (canvas) => RenderSkia?.Invoke(canvas);
}
public override void Render(DrawingContext context)
{
renderingLogic.Bounds = new Rect(0, 0, this.Bounds.Width, this.Bounds.Height);
context.Custom(renderingLogic);
}
}
现在你可以在自己的AXAML中使用Skia画布:
<views:SkiaCanvas Height="200" RenderSkia="HandleRenderSkia"></views:SkiaCanvas>
在您的代码后台中实现HandleRenderSkia:
void HandleRenderSkia(SKCanvas canvas)
{
canvas.DrawCircle(100, 100, 80, new SKPaint() { Color = SKColors.Green, IsAntialias = true });
}
现在您将拥有完整的Skia渲染:
OnRender
并使用DrawingContext
,如果StreamGeometry
足够满足你的需求。 - kekekeks