59 lines
2.0 KiB
C#
59 lines
2.0 KiB
C#
using SkiaSharp.Views.Forms;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using Xamarin.Forms;
|
|
|
|
namespace DataDisplay.Controls
|
|
{
|
|
public class CanvasView : SKCanvasView
|
|
{
|
|
public static readonly BindableProperty RendererProperty = BindableProperty.Create(
|
|
nameof(Renderer),
|
|
typeof(Renderers.IRenderer),
|
|
typeof(CanvasView),
|
|
null,
|
|
defaultBindingMode: BindingMode.TwoWay,
|
|
propertyChanged: (bindable, oldValue, newValue) =>
|
|
{
|
|
((CanvasView)bindable).RendererChanged((Renderers.IRenderer)oldValue, (Renderers.IRenderer)newValue);
|
|
});
|
|
|
|
// callback appelée lors de la modificiation de la propriété "Renderer"
|
|
void RendererChanged(Renderers.IRenderer currentRenderer, Renderers.IRenderer newRenderer)
|
|
{
|
|
if (currentRenderer != newRenderer)
|
|
{
|
|
// détacher l'événement de l'ancien renderer
|
|
if (currentRenderer != null)
|
|
currentRenderer.RefreshRequested -= Renderer_RefreshRequested;
|
|
|
|
// attacher l'événement du nouveau renderer
|
|
if (newRenderer != null)
|
|
newRenderer.RefreshRequested += Renderer_RefreshRequested;
|
|
|
|
// rafraichir le contrôle
|
|
InvalidateSurface();
|
|
}
|
|
}
|
|
|
|
// Causes refreshing during an event triggered by the ISKRenderer interface
|
|
void Renderer_RefreshRequested(object sender, EventArgs e)
|
|
{
|
|
InvalidateSurface();
|
|
}
|
|
|
|
protected override void OnPaintSurface(SKPaintSurfaceEventArgs e)
|
|
{
|
|
if (null == Renderer) return;
|
|
Renderer.PaintSurface(e.Surface, e.Info);
|
|
}
|
|
|
|
public Renderers.IRenderer Renderer
|
|
{
|
|
get { return (Renderers.IRenderer)GetValue(RendererProperty); }
|
|
set { SetValue(RendererProperty, value); }
|
|
}
|
|
}
|
|
}
|