使用 Xamarin Forms 和 Prism 绑定 SkiaSharp 的 PaintSurface
Binding SkiaSharp's PaintSurface with Xamarin Forms and Prism
我正在尝试让 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。如果我移动它,则内容无效
- 如何从 ViewModel 引用 xaml 元素?我不想这样做,因为我的 ViewModel 然后与视图耦合。
(首选方式)如果我在我的页面上放置一个 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);
我假设它是此处的 EventArgs 选项之一 https://prismlibrary.github.io/docs/xamarin-forms/EventToCommandBehavior.html ?
谢谢
所以使用值转换器解决了它..
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();
}
}
不完全确定为什么它不能自动转换它但它有效
我正在尝试让 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。如果我移动它,则内容无效
- 如何从 ViewModel 引用 xaml 元素?我不想这样做,因为我的 ViewModel 然后与视图耦合。
(首选方式)如果我在我的页面上放置一个 SKCanvasView
我可以使用 EventToCommandBehaviour 绑定到事件
<forms:SKCanvasView>
<forms:SKCanvasView.Behaviors>
<behaviors:EventToCommandBehavior Command="{Binding OnCanvasViewPaintSurface}" EventName="PaintSurface"/>
</forms:SKCanvasView.Behaviors>
</forms:SKCanvasView>
但我不确定如何为
绑定 SKPaintSurfaceEventArgsOnCanvasViewPaintSurface = new DelegateCommand<SKPaintSurfaceEventArgs>(OnCanvasViewPaintAction);
我假设它是此处的 EventArgs 选项之一 https://prismlibrary.github.io/docs/xamarin-forms/EventToCommandBehavior.html ?
谢谢
所以使用值转换器解决了它..
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();
}
}
不完全确定为什么它不能自动转换它但它有效