【问题标题】:Binding SkiaSharp's PaintSurface with Xamarin Forms and Prism将 SkiaSharp 的 PaintSurface 与 Xamarin Forms 和 Prism 绑定
【发布时间】:2019-07-31 09:28:36
【问题描述】:

我正在尝试让 SkiaSharp 与 Xamarin Forms 和 Prism 一起使用。我让它在代码后面的以下页面上工作

public partial class RoomLayoutPage : ContentPage 
{ 

SKCanvasView canvasView;

public RoomLayoutPage()
{
  InitializeComponent();

  canvasView = new SKCanvasView();
  canvasView.PaintSurface += OnCanvasViewPaintSurface;
  Content = canvasView;
}


private void OnCanvasViewPaintSurface(object sender, SKPaintSurfaceEventArgs e)
{
  SKSurface surface = e.Surface;
  SKCanvas canvas = surface.Canvas;

  canvas.Clear();

  SKPaint blackPaint = new SKPaint
  {
    Color = SKColors.Black,
  };

  canvas.DrawRect(0, 0, 100, 100, blackPaint);
}
}

但现在我想将其移至我的 Prism ViewModel。如果我移动它,则内容无效

  1. 如何从 ViewModel 中引用 xaml 元素?我不想这样做,因为我的 ViewModel 会与视图耦合。
  2. (首选方式)如果我在我的页面上放置一个 SKCanvasView

我可以使用 EventToCommandBehaviour 绑定到事件

    <forms:SKCanvasView>
  <forms:SKCanvasView.Behaviors>
    <behaviors:EventToCommandBehavior Command="{Binding OnCanvasViewPaintSurface}" EventName="PaintSurface"/>
  </forms:SKCanvasView.Behaviors>
</forms:SKCanvasView>

但我不确定如何为 SKPaintSurfaceEventArgs 绑定

OnCanvasViewPaintSurface = new DelegateCommand<SKPaintSurfaceEventArgs>(OnCanvasViewPaintAction);

我假设这是 https://prismlibrary.github.io/docs/xamarin-forms/EventToCommandBehavior.html 的 EventArgs 选项之一?

谢谢

【问题讨论】:

    标签: xamarin prism skiasharp


    【解决方案1】:

    所以使用值转换器解决它..

    public class SkiaEventArgsConverter : IValueConverter
    {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
      var sKPaintSurfaceEventArgs = value as SKPaintSurfaceEventArgs;
      if (sKPaintSurfaceEventArgs == null)
      {
        throw new ArgumentException("Expected value to be of type SKPaintSurfaceEventArgs", nameof(value));
      }
    
      return sKPaintSurfaceEventArgs;
    }
    
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
      throw new NotImplementedException();
    }
    }
    

    不完全确定为什么它不能自动转换,但它可以工作

    【讨论】:

      猜你喜欢
      • 2018-10-12
      • 2016-06-06
      • 2019-04-12
      • 2017-10-19
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      • 2018-02-24
      • 2018-02-09
      相关资源
      最近更新 更多