This commit is contained in:
Matthew Leibowitz 2016-10-04 15:20:46 +02:00
Родитель 0fb3035a0a
Коммит f07f23b54b
2 изменённых файлов: 98 добавлений и 0 удалений

Просмотреть файл

@ -0,0 +1,97 @@
using System;
using System.ComponentModel;
using Xamarin.Forms.Platform.UWP;
using SKFormsView = SkiaSharp.Views.Forms.SKGLView;
using SKNativeView = SkiaSharp.Views.SKSwapChainPanel;
[assembly: ExportRenderer(typeof(SKFormsView), typeof(SkiaSharp.Views.Forms.SKGLViewRenderer))]
namespace SkiaSharp.Views.Forms
{
internal class SKGLViewRenderer : ViewRenderer<SKFormsView, SKNativeView>
{
protected override void OnElementChanged(ElementChangedEventArgs<SKFormsView> e)
{
if (e.OldElement != null)
{
var oldController = (ISKGLViewController)e.OldElement;
// unsubscribe from events
oldController.SurfaceInvalidated -= OnSurfaceInvalidated;
}
if (e.NewElement != null)
{
var newController = (ISKGLViewController)e.NewElement;
// create the native view
var view = new InternalView(newController);
SetNativeControl(view);
// subscribe to events from the user
newController.SurfaceInvalidated += OnSurfaceInvalidated;
// start the rendering
SetRenderMode();
}
base.OnElementChanged(e);
}
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
// refresh the render loop
if (e.PropertyName == SKFormsView.HasRenderLoopProperty.PropertyName)
{
SetRenderMode();
}
}
protected override void Dispose(bool disposing)
{
// detach all events before disposing
var controller = (ISKGLViewController)Element;
if (controller != null)
{
controller.SurfaceInvalidated -= OnSurfaceInvalidated;
}
base.Dispose(disposing);
}
// the user asked to repaint
private void OnSurfaceInvalidated(object sender, EventArgs eventArgs)
{
// if we aren't in a loop, then refresh once
if (!Element.HasRenderLoop)
{
Control.Invalidate();
}
}
private void SetRenderMode()
{
Control.EnableRenderLoop = Element.HasRenderLoop;
}
private class InternalView : SKNativeView
{
private readonly ISKGLViewController controller;
public InternalView(ISKGLViewController controller)
{
this.controller = controller;
}
protected override void OnPaintSurface(SkiaSharp.Views.SKPaintGLSurfaceEventArgs e)
{
base.OnPaintSurface(e);
controller.OnPaintSurface(new SKPaintGLSurfaceEventArgs(e.Surface, e.RenderTarget));
}
}
}
}

Просмотреть файл

@ -42,6 +42,7 @@
</ItemGroup>
<ItemGroup>
<Compile Include="SKCanvasViewRenderer.cs" />
<Compile Include="SKGLViewRenderer.cs" />
<EmbeddedResource Include="Properties\SkiaSharp.Views.Forms.UWP.rd.xml" />
</ItemGroup>
<ItemGroup>