学无先后达者为师!
不忘初心,砥砺前行。

【.NET Core 跨平台 GUI 开发】第一篇:编写你的第一个 Gtk# 应用

本文是【.NET Core 跨平台 GUI 开发】系列博文的第一篇。该系列博文是一个关于 Gtk# 跨平台应用开发的初级随笔集合。该随笔集合介绍了 GTK 和 Gtk# 的基本信息以及开发方法,并展示了如何使用 .NET Core 技术栈开发基于 Gtk# 的跨平台 GUI 程序。

博文假设你已经对 C# 有一定的了解且熟悉事件驱动,所使用的电脑中已经安装好了 Visual Studio 以及 .NET Core 开发环境。如果你熟悉 WinForm 应用程序的开发,那么你将轻松不少。

1、GTK 和 Gtk#

什么是 GTK ?

GTK(原名GTK+)最初是GIMP的专用开发库(GIMP Toolkit),后来发展为Unix-like系统下开发图形界面的应用程序的主流开发工具之一。GTK是自由软件,并且是GNU计划的一部分。自2019年2月6日起,GTK+改名为GTK。

维基百科: https://zh.wikipedia.org/wiki/GTK

什么是 Gtk# ?

Gtk#是个.NET的库,用来绑定GTK+ GUI库。它让你可以使用Mono或其他兼容CLR的语言来开发GNOME应用程序。

Gtk#像其他现在的视窗库一样,采用事件驱动,让开发者可以在视窗组件的事件被触发时,处理要做的事情。

以Gtk#创建的应用程序可以运行在许多平台上,如Linux、Microsoft Windows与Mac OS X等。

维基百科:https://zh.wikipedia.org/wiki/Gtk%E2%99%AF

简单来说 GTK 是一款在类 Unix 系统下进行图形界面开发的工具。Gtk# 是一个 .NET 的库,他对 GTK 进行了包装,这样我们就可以使用 C# 来调用 GTK 进行图形界面开发。因为 GTK 非常流行且是自由软件,所以 Gtk# 可以在许多平台上运行。

我们要使用的 Gtk# 来自 https://github.com/GtkSharp/GtkSharp ,是 Mono Gtk Sharp 的一个分支。该版本的 Gtk# 组件提供了对 .NET Core 和 GTK3 的支持、发布了 NuGet 包并提供了在 Windows 下无需安装的运行环境。

2、在 Mac OS 系统中安装 GTK

如果你使用 Mac OS 进行开发,那么在开始之前,你需要在本机安装好 GTK 环境。安装过程并不复杂,如果你在中国大陆,你可能需要一个强壮有力的网络,这将为你带来流畅的安装体验。具体的安装过程参见: Installing Gtk on Mac

3、第一个 Gtk# 应用

打开 Visual Studio 新建一个 .NET Core 控制台应用并命名为 Gtk.HelloWorld 。在项目创建好后,通过 NuGet 将 GtkSharp 引用到项目中。如果你对 NuGet 并不熟悉,可以参考这篇文章:在 Visual Studio 中安装和管理 NuGet 包

为 Hello World 应用安装 GtkSharp 包

将以下代码粘贴到 Programe.cs 文件中:

using System;
using Gtk;

namespace Gtk.HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            Application.Init();
            var win = new Window("Hello World!");
            win.SetDefaultSize(300, 600);
            //窗体关闭后退出应用
            win.DeleteEvent += (s, e) =>
             {
                 Application.Quit();
             };
            win.WindowPosition = WindowPosition.Center;
            win.Resizable = false;
            var label = new Label("This is a label!");
            win.Add(label);
            win.ShowAll();
            Application.Run();
            Console.WriteLine("Hello World!");
        }
    }
}

点击菜单栏中的 ” 调试 ” -> ” 开始调试 ” 或者直接按 “ F5 ”键运行程序调试。在编译完成并启动后,就可以看到一个控制台的黑框紧接着在屏幕的中央出现了一个 300*600 的窗体,我们的 Hello World 就完成了。

运行 Hello World

如果你是第一次运行 Gtk# 程序且本机并没有安装 Gtk 环境,那么编译的时间会稍微长一些。如果你恰巧网络环境不是很好,访问 GitHub 速度很慢,那么你可能会遇到 Visual Studio 提示下面这个错误:

 Gtk has not been detected, downloading and installing it, set SkipGtkInstall to True to skip theese steps. 

这是因为 Gtk# 的程序包在编译时会尝试检测本地是否安装有 GTK 环境,如果没有安装,那么他会自己去 GitHub 上下载一份回来并解压,如果下载解压失败,就会提示上面的错误。(详情可参看:GtkSharp.targets)。

目前来说(2019年11月19日),Gtk# 的默认检测地址是:

$(LOCALAPPDATA)\Gtk\3.24

这个地址在我的电脑上的绝对路径是: C:\Users\Killer\AppData\Local\Gtk\3.24 。其中 Killer 是我电脑的登录用户名,你可能需要将其替换掉才能找到正确的位置。如果这个位置中不包含 Gtk 的运行时文件,那么程序会尝试去 https://github.com/GtkSharp/Dependencies/raw/master/gtk-3.24.zip 下载,并解压到该位置。

除了改善网络环境,我们还可以手动将运行时安装到本地电脑。手动安装的步骤如下:

  1. 确保你找到了正确的 Gtk 运行时路径并建立好了文件夹(比如: C:\Users\Killer\AppData\Local\Gtk\3.24 )。
  2. 使用下载工具(比如:IDM、迅雷、QQ旋风等)下载文件 https://github.com/GtkSharp/Dependencies/raw/master/gtk-3.24.zip 到本地。
  3. 将下载到的文件解压缩,并将所有文件复制到 Gtk 运行时文件夹。
  4. 操作完成后的 Gtk 运行时文件夹类似下图:
Gtk 运行时文件夹

现在,你的应用程序应该可以正常运行起来了。

4、程序分析

Hello World 程序的代码可以在 gtk-sharp-demo/Gtk.HelloWorld 中找到。

如果你开发过 WinForm 程序,你可能会注意到的第一件事是我们没有为 Label 添加布局代码。比如,我们没有规定 label.Left = 100label.Width = 200 ,我们只是将 label 添加到窗体中:win.Add(label);。这是因为 Gtk.Window 是从 Bin 继承的窗口小部件,或者是承载“Container”的单个窗口小部件。这可能有些难以理解,但是目前你可以仅仅记住,Gtk.Window 只能直接包含一个部件。

另一个值得关注的部分是 Application.Init()Application.Run() 。通常,当应用程序处理完其主线程上的所有代码后,应用程序将停止。因为 Gtk.Window 的 ShowAll() 方法不会阻止主线程,因此代码将继续运行并关闭。 Application.Init() 命令告诉运行时监听所有启动的 Gtk.Window ,当运行 Application.Run() 命令时,它将在这些窗口上启动主循环。这将使应用程序保持运行状态,直到我们调用 Application.Quit() 方法退出程序。

Gtk.Window 类型的 SetDefaultSize 方法用来设置窗体的默认大小。WindowPosition 属性可以获取或设置窗体出现的位置。Resizable 属性可以决定是否允许用户手动调整窗体的大小,当这个属性设置为 flase 时,窗体就不能通过鼠标拖动改变大小了,同时最大化按钮也被禁用掉了。

在 WinForm 中,我们通过注册 Closed 事件来在窗体关闭后做一些事情,在 Gtk# 中需要改为 DeleteEvent 事件。在主窗体被删除时退出程序是一步很关键的操作,否则会出现所有窗体都关闭了但是应用程序没有退出的情况。

赞(41) 打赏
未经允许不得转载:码农很忙 » 【.NET Core 跨平台 GUI 开发】第一篇:编写你的第一个 Gtk# 应用

评论 6

  1. 官方好像没有提供支持哦。

    Soar、毅5个月前 (11-07)
  2. #4

    博主,问一下像这种ScottPlot的图表控件,能在这个框架上用吗?

    petejones6个月前 (10-28)
  3. #3

    macOS 中会得到「GLib-CRITICAL **: void g_datalist_id_set_data_full(GData **, GQuark, gpointer, GDestroyNotify): assertion `key_id > 0' failed」的错误直接崩溃,也不可见到窗体

    Max Sky3年前 (2021-09-15)
  4. #2

    感谢,非常期待

    lvyiwuhen4年前 (2020-07-06)
  5. 在 Ubuntu 系统中安装好 .NET Core 运行时,将程序发布并复制到目标机器上,使用 dotnet Gtk.HelloWorld.dll 命令即可启动应用。笔者会陆续推出 Gtk# 相关文章,包含多系统部署,敬请期待。

    Soar、毅4年前 (2020-07-06)
  6. #1

    请问这样编写的图形程序如何在Linux中部署运行呢?比如Ubuntu桌面系统中

    lvyiwuhen4年前 (2020-07-06)

给作者买杯咖啡

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册