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

如何不借助WinForms、WPF等框架使用SkiaSharp打开窗口并绘制内容

实现方案

核心逻辑是先通过轻量级跨平台窗口库(或系统原生API)创建无UI框架依赖的裸窗口,再将窗口的绘制表面与SkiaSharp的渲染上下文绑定,即可直接调用SkiaSharp的全量绘制API实现需求。

依赖选择

不需要引入WinForms/WPF等重型UI框架,推荐使用以下轻量级组件:

  • 窗口创建:用Silk.NET.GLFW,跨平台封装了GLFW窗口API,支持Windows/macOS/Linux,不需要自己写系统级P/Invoke代码
  • 绘制核心:SkiaSharp,自带所需的圆角矩形、渐变、阴影等所有绘制能力

实现步骤

  1. 安装对应NuGet包
    直接在项目中安装以下包即可,不需要额外配置:
    • SkiaSharp
    • Silk.NET.GLFW
    • 非Windows平台补充安装对应原生资产:SkiaSharp.NativeAssets.macOS / SkiaSharp.NativeAssets.Linux
  2. 初始化窗口与渲染上下文
    核心代码逻辑示例:
    using Silk.NET.GLFW;
    using SkiaSharp;
    
    // 初始化GLFW
    Glfw glfw = Glfw.GetApi();
    glfw.Init();
    
    // 配置窗口属性,不使用额外UI组件
    glfw.WindowHint(WindowHintClientApi.ClientApi, ClientApi.OpenGlApi);
    glfw.WindowHint(WindowHintOpenGlProfile.OpenGlProfile, OpenGlProfile.Core);
    glfw.WindowHint(WindowHintInt.ContextVersionMajor, 3);
    glfw.WindowHint(WindowHintInt.ContextVersionMinor, 3);
    
    // 创建窗口
    var window = glfw.CreateWindow(800, 600, "SkiaSharp 绘制窗口", null, null);
    glfw.MakeContextCurrent(window);
    
    // 创建Skia GPU渲染上下文
    var grContext = GRContext.CreateGl();
    var renderTarget = new GRBackendRenderTarget(800, 600, 0, 8, new GRGlFramebufferInfo(0, SKColorType.Rgba8888.ToGlSizedFormat()));
    var surface = SKSurface.Create(grContext, renderTarget, GRSurfaceOrigin.BottomLeft, SKColorType.Rgba8888);
    var canvas = surface.Canvas;
    
  3. 主消息循环与绘制
    在窗口的主循环中直接调用Skia的绘制API即可:
    while (!glfw.WindowShouldClose(window))
    {
        // 清屏
        canvas.Clear(SKColors.White);
    
        // 绘制带阴影的渐变圆角矩形示例
        var paint = new SKPaint
        {
            IsAntialias = true,
            Shader = SKShader.CreateLinearGradient(
                new SKPoint(0, 0), new SKPoint(200, 200),
                new[] { SKColors.Blue, SKColors.Purple },
                SKShaderTileMode.Clamp
            ),
            ImageFilter = SKImageFilter.CreateDropShadow(5, 5, 10, 10, SKColors.Black.WithAlpha(128))
        };
        canvas.DrawRoundRect(new SKRect(100, 100, 300, 300), 20, 20, paint);
    
        // 提交绘制到屏幕
        surface.Flush();
        glfw.SwapBuffers(window);
        // 处理窗口事件
        glfw.PollEvents();
    }
    
    // 资源释放
    surface.Dispose();
    grContext.Dispose();
    glfw.DestroyWindow(window);
    glfw.Terminate();
    

可选方案:原生API直接调用

如果不想引入GLFW依赖,可以直接通过P/Invoke调用对应系统的窗口创建API:

  • Windows平台:调用user32.dll的CreateWindowEx创建窗口,获取窗口HDC后绑定到SKSurface的光栅渲染目标
  • macOS平台:调用AppKit的NSWindow接口创建窗口,获取CALayer作为绘制目标
  • Linux平台:调用X11的XCreateWindow创建窗口,获取绘制上下文后绑定Skia渲染目标
    该方案不需要第三方依赖,但需要自行处理多平台兼容逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:54:03