You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin项目中SkiaSharp的PaintSurface事件未触发咨询

SKCanvasView PaintSurface事件不触发的根本原因

你当前代码的核心问题是:在构造函数中创建的SKCanvasView是未被加入页面可视化树的局部对象,不满足绘制事件的触发条件。
PaintSurface是控件的绘制回调,仅当控件被平台渲染管线接管、拥有合法的绘制尺寸和渲染上下文时才会触发。你在构造函数中刚实例化控件就调用InvalidateSurface(),此时控件既没有挂载到任何可见的父容器上,也没有完成布局计算,系统根本不会调度它的绘制流程,事件自然不会执行。

必须修改/补充的实现步骤
  • 将canvasView从构造函数的局部变量提升为类级别的字段,避免对象被GC意外回收,同时方便后续其他方法调用控件实例。
  • 把控件实例添加到当前页面的可视化树中,这是触发绘制的必要前提:
    如果你开发的是Xamarin.Forms项目,直接把canvasView赋值给ContentPage的Content属性,或者加入现有布局的Children集合即可,参考代码:
    // 类级别字段声明
    private SKCanvasView canvasView;
    
    public ColorDemo()
    {
        // 若页面使用XAML编写,必须先调用InitializeComponent()
        InitializeComponent();
    
        canvasView = new SKCanvasView();
        // 先把控件挂载到可视化树
        Content = canvasView;
        // 再绑定绘制事件
        canvasView.PaintSurface += canvasView_PaintSurface;
    }
    
    如果你开发的是Xamarin原生项目(Android/iOS),对应调用平台原生的子视图添加方法,把SKCanvasView添加到当前显示的Activity/ViewController的根视图上即可。
  • 移除构造函数里的canvasView.InvalidateSurface()调用。只要控件成功挂载到可视化树,首次加载完成后系统会自动触发一次PaintSurface事件,不需要手动在构造函数中触发。如果后续需要手动重绘,在控件的Loaded事件回调、或者按钮点击等用户交互逻辑里调用InvalidateSurface()即可。
额外排查点

如果完成以上修改后事件仍不触发,逐一检查以下配置:

  • 确认所有相关项目(主项目+各平台项目)都安装了版本完全一致的SkiaSharp相关NuGet包:Forms项目需要安装SkiaSharp和SkiaSharp.Views.Forms,原生项目安装对应平台的SkiaSharp.Views.Android/SkiaSharp.Views.iOS包,版本号不一致会导致渲染链路异常。
  • 确认SKCanvasView的IsVisible属性为true,且实际宽高不为0,没有被其他同级控件完全遮挡,不可见的控件不会执行绘制逻辑。
  • 如果你已经在XAML中定义了SKCanvasView,不要在后台代码中重复new新的SKCanvasView实例,否则事件绑定的是新创建的未挂载实例,和页面上实际显示的控件不是同一个对象。

内容的提问来源于stack exchange,提问作者Paulo Eduardo Pilon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:09:26