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

.NET MAUI中SkiaSharp SKCanvasView尺寸大于0时崩溃

问题1:SKCanvasView 调试崩溃排查与解决

核心可能原因

  • 预览版SkiaSharp兼容性问题:你使用的3.0.0-preview.4.1是预览版本,在.NET 8 Windows环境下可能存在未修复的布局渲染bug,这是导致崩溃的高概率原因。
  • 布局约束缺失:AbsoluteLayout中的SKCanvasView未指定布局边界与约束,控件宽高计算逻辑可能出现异常,当手动设置宽高后触发重绘时引发崩溃。

解决方案

  1. 降级到稳定版SkiaSharp
    卸载当前预览包,安装稳定版(如2.88.8),稳定版与.NET 8的兼容性经过充分验证:

    Uninstall-Package SkiaSharp.Views.Maui.Controls
    Install-Package SkiaSharp.Views.Maui.Controls -Version 2.88.8
    
  2. 修复AbsoluteLayout布局约束
    给SKCanvasView添加明确的布局规则,避免无约束导致的宽高计算异常:

    <AbsoluteLayout x:Name="LayoutHelperView" BackgroundColor="LightBlue">
        <skia:SKCanvasView x:Name="skiaView" BackgroundColor="White" 
                           AbsoluteLayout.LayoutBounds="0,0,100,100" 
                           AbsoluteLayout.LayoutFlags="None"/>
        <Button x:Name="TestBtn" Text="Test SkiaView" Clicked="OnTestBtnClicked" />
    </AbsoluteLayout>
    

    或者让控件自适应父布局:

    <skia:SKCanvasView x:Name="skiaView" BackgroundColor="White" 
                       AbsoluteLayout.LayoutBounds="0,0,1,1" 
                       AbsoluteLayout.LayoutFlags="All"/>
    
  3. 优化宽高设置时机
    避免在按钮点击时直接修改WidthRequest/HeightRequest,改为在页面加载完成后初始化:

    protected override void OnAppearing()
    {
        base.OnAppearing();
        // 页面加载完成后设置初始宽高
        skiaView.WidthRequest = 100;
        skiaView.HeightRequest = 100;
    }
    
  4. 捕获具体异常信息
    在App.xaml.cs中全局订阅未处理异常,获取崩溃的详细堆栈:

    public App()
    {
        InitializeComponent();
        AppDomain.CurrentDomain.UnhandledException += (s, e) =>
        {
            var exception = e.ExceptionObject as Exception;
            System.Diagnostics.Debug.WriteLine($"未处理异常:{exception?.Message}\n{exception?.StackTrace}");
        };
    }
    

问题2:ViewModel WinRT兼容性警告解决

警告提示SubPage1ViewModel需要标记为partial,原因是该类在Windows平台下隐式实现了WinRT接口,未标记partial会影响修剪和AOT编译兼容性。

解决方案

直接将ViewModel的类声明修改为partial:

public partial class SubPage1ViewModel // 若继承了ObservableObject等基类,保留原有继承
{
    // ViewModel逻辑代码
}

这样编译器会自动生成必要的WinRT兼容代码,消除警告。


内容的提问来源于stack exchange,提问作者Ridnok983

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 00:59:55