Miko 是一个开源的 C# 跨平台 UI 框架,使用你熟悉的原生 WinForms 设计器来构建跨平台应用程序。 从单个共享代码库,一次开发即可部署到 Android、iOS、Linux(国内信创平台适用)、macOS、WebAssembly 和 Windows。
Miko 基于 SDL3 跨平台窗体系统和 Skia 渲染引擎,将你的 .NET 应用带到所有主流平台。
10+
glibc >= 2.28
10.15+
API >= 24
12+
实验性
从设计器到部署,Miko 提供全链路的跨平台开发体验,而这一切都基于开源免费的理念。
与 WinForms 设计器完全兼容,保证原生级设计器体验。在 Visual Studio 中拖拽式设计界面,所见即所得。
使用 Skia 作为界面渲染器,精准控制界面上每一个像素点的绘制,创建精美且完全自定义的 UI 组件。
Miko 正在接入 Impeller 渲染引擎。相比 Skia,Impeller 通过预编译着色器消除首次绘制卡顿(SkSL → SPIR-V),并利用 Metal/Vulkan 后端实现更低的 CPU 开销和更稳定的帧率,动画和滚动场景流畅度大幅提升。
基于 SDL3 跨平台多媒体库,深度支持 Windows、macOS、Linux、iOS、Android 等主流操作系统与平台。
支持 OpenGL、Vulkan、Direct3D 12 等多种 GPU 后端,为不同平台带来真正的硬件加速渲染体验。
提供 WinForms 的所有标准控件:Button、Label、TextBox、DataGridView、ListView 等,开箱即用。
列表类控件针对大数据量深度优化,百万级数据滑动操作依然流畅无比,满足企业级应用需求。
提供基于平台的原生浏览器控件,在你的桌面应用中无缝嵌入 Web 内容,实现混合应用开发。
支持使用 Miko 框架开发完全自定义的控件,利用 Skia 渲染器绘制独一无二的 UI 组件。
兼容 WinForms 的 GDI 绘制方法,你的自定义 OnPaint 控件几乎无需修改即可迁移至 Miko 运行,轻松复用现有 WinForms 控件资产。
原生支持 SVG 矢量图形渲染,让你的应用界面在任何分辨率下都保持清晰锐利。
原生支持自定义圆角(CornerRadius)、投影(DropShadow)、渐变(Gradient)、透明度(Opacity)等现代界面样式,轻松构建现代化 UI。
完全支持 .NET Native AOT 编译,应用启动更快、内存占用更低,可编译为单一原生可执行文件。
Miko 框架完全开源免费,基于 LGPL-2.1 许可证。欢迎社区贡献,共同打造最好的 .NET 跨平台 UI 框架。
Miko 支持多种 GPU 后端,为你的应用在不同平台带来真正的硬件加速体验。
| 平台 | OpenGL | Vulkan | Direct3D 12 | Metal |
|---|---|---|---|---|
| Windows | ✓ 默认 | ✓ 支持 | ✓ 支持 | — |
| Linux | ✓ 默认 | ✓ 支持 | — | — |
| macOS | ✓ 默认 | — | — | ○ 后续支持 |
| Android | ✓ 默认 | ○ 后续支持 | — | — |
| iOS | ✓ 支持 | — | — | — |
| WebAssembly | ✓ 支持 | — | — | — |
保留 WinForms 的开发体验,输出跨平台的原生应用。
using Miko;
namespace MyApp;
internal static class Program
{
[STAThread]
static void Main(string[] args)
{
MikoApp.Create()
.UseDesktopPlatform()
.UseMainWindow<Form1>()
.Build();
/* Here we go! */
MikoApp.Run();
}
}
using Miko;
using Miko.Events;
using Miko.Dialogs;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
namespace MyApp;
public partial class Form1 : Window
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, MouseEventArgs e)
{
MessageBox.Show("Hello");
}
}
namespace MyApp;
partial class Form1
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
label1 = new Miko.Controls.Label();
button1 = new Miko.Controls.Button();
SuspendLayout();
//
// label1
//
label1.FontName = "Arial";
label1.Location = new Point(243, 105);
label1.Name = "label1";
label1.Size = new Size(258, 49);
label1.TabIndex = 0;
label1.Text = "Hello World";
label1.TextAlign = ContentAlignment.MiddleCenter;
//
// button1
//
button1.FontName = "Arial";
button1.Location = new Point(243, 229);
button1.Name = "button1";
button1.Size = new Size(258, 91);
button1.TabIndex = 1;
button1.Text = "Hello";
button1.Click += button1_Click;
//
// Form1
//
BackColor = SystemColors.Control;
ClientSize = new Size(784, 561);
Controls.Add(button1);
Controls.Add(label1);
Location = new Point(0, 0);
Name = "Form1";
Text = "Form1";
ResumeLayout(false);
}
#endregion
private Miko.Controls.Label label1;
private Miko.Controls.Button button1;
}
Miko 采用五层架构,每一层各司其职,共同构建跨平台能力。