转自:http://developer.51cto.com/art/201011/235040.htm

Mono一直到现在的2.8已经完全可以胜任一些比较小的项目了,但相关的开发文档与教程一直比较匮乏,中文材料更是屈指可数。虽然Mono与.net很多类库都是通用的,但Mono仍然有为数不少的扩充类库,其中最重要的就是对于GTK二次封装的GTK#图形界面类库了,目前想要开发原生的Mono图形界面程序此类库必不可少。在MonoDevelop里已经支持对于GTK#界面设计的直接拖放,有相关经验的开发人员可以很快上手。

Mono官方网站上也有一篇GTK#开发的入门文档:Stetic GUI Designer,现在结合此教程简要概述一下如何在MonoDevelop下使用GTK#。

首先,我们需要做的就是创建一个工程……(这是一句废话)。在MonoDevelop主界面选择文件->New->Solution(话说目前MonoDevelop汉化工作还未彻底完成,菜单中中文夹英文……),在弹出来的对话框选择C#->GTK#2.0工程。

输入想建立的工程名,我们这里用“SteticTutorial”,然后点新建。再下面的一个对话框中根据自己的需求选择,然后就可以点击OK了。

稍等一会之后,可以看到MonoDevelop已经帮我们做好了一个GTK#工程所需要做的最基本的工作了,点击运行菜单里的运行按钮或者工具栏上的齿轮按钮就可以编译执行当前工程了,因为我们现在什么也没做,只是单纯弹出了一个空白的窗体。

嗯嗯,很漂亮的界面……咳咳……

现在我们要往这个界面中添加一些控件,双击工程目录中的MainWindow.cs,这里可以看到窗体事件的代码。注意看MonoDevelop的下方有两个选项,目前选中的是“源代码”,现在让我们点击“设计器”。

界面右侧有隐藏的工具栏,其中有常用的控件,现在我们可以使用常用的拖放操作来画窗体了,万岁~

好了,现在我们先不急,首先选中主窗体(MainWindow),然后再右侧的属性栏可以查看当前选中控件的属性。

我们先把Window Tile一项改成需要的名字,这一项决定了窗体运行时标题栏上的文字。

好了,剩下的就是往窗体中拖放控件。这里GTK#与WinForms有一些不同,WinForms下直接往窗体上拖放需要使用的控件就好,而基于GTK的GTK#,大部分控件都需要放在“容器”中。容器就是专门用来盛放控件的控件,在工具栏的第一部分全是这些容器。GTK#就是依赖这些容器来进行控件的定位的,学习过Swing或者QT的同学应该很容易理解。

根据我们的需要,我们往主窗体拖放一个VBox。VBox是一个纵向排列的容器,将窗体分割为了一个个纵向的单元,可以往这些单元中添加控件或者其他容器来满足需求。

默认的VBox有三栏,我们需要两栏就足够了。右击第三个,选择“Delete”。

大部分窗体应用中菜单栏是不可或缺的一部分,所以我们首先要往窗体中VBox顶栏中添加一个MenuBar。VBox的一个很有意思的特性就是可以根据它其中的控件而改变容器的大小,所以当我们把MenuBar拖进第一栏的时候可以看到MenuBar并没有变得像整个窗体一半大小那样难看,而是自动将VBox缩成单行的宽度了。

接下来添加菜单选项就很简单了,直接点击“Click to create menu”就可以添加按钮,还可以选择按钮的图标。选中菜单,在属性栏还可以设置Accelerator项来设定此菜单的快捷键。

建立完菜单后,MainWindow.cs的窗体下多了一个选项“行为”(英文叫Action),点开,看到我们之前在菜单栏中所有的定义。选中“Exit”,然后查看属性栏,注意看属性栏上方有一个“信号”(Signal)的选项看,选择它。

在“Activated”项后面的Hander一栏点击“Click here to add a new hander”,需要注意的是很多时候因为工具栏默认宽度有些窄而导致Handler项显示不出来,我们可以拉长一下工具栏的长度。点击后添加一个“OnExit”的事件,双击它进入源代码编辑窗口。

这里添加一句代码:

  1. protectedvirtualvoid OnExit(object sender, System.EventArgs e)
  2. {
  3. Application.Quit();
  4. }

尝试编译运行一下,在程序菜单栏的File菜单栏中选择Exit,看看程序是否如期关闭。

如果你的代码没有问题的话,让我们继续往下走。现在VBox的下栏还空着,我们往里添加一个TextView控件,命名为logTextView。原教程中提到先要添加一个ScrolledWindow容器,再往其中填充TextView控件才能实现滚动条,但实际发现ScrolledWindow容器并非必需的,大概是GTK#版本不同的缘故吧。

好了,现在我们的程序界面已经完成,已经可以在窗体写入文字。不过你会发现有一个小问题,TextView并不能自动换行,每当一行文字的长度超过窗体的长度时程序只是添加了一个水平的滚动条。解决这个问题的方法很简单,只要将textview控件的Wrap Mode改为Word or Charactor就可以了。实际编程中最好将此属性最为可选项提供为用户。

剩下的就是在每个菜单添加相应时间代码:

  1. For the OnOpen method:
  2. protectedvirtualvoid OnOpen(object sender, System.EventArgs e) {
  3. // Reset the logTreeView and change the window back to original size
  4. int width, height;
  5. this.GetDefaultSize( out width, out height );
  6. this.Resize( width, height );
  7. logTextView.Buffer.Text = "";
  8. // Create and display a fileChooserDialog
  9. FileChooserDialog chooser = new FileChooserDialog(
  10. "Please select a logfile to view ...",
  11. this,
  12. FileChooserAction.Open,
  13. "Cancel", ResponseType.Cancel,
  14. "Open", ResponseType.Accept );
  15. if( chooser.Run() == ( int )ResponseType.Accept ) {
  16. // Open the file for reading.
  17. System.IO.StreamReader file =
  18. System.IO.File.OpenText( chooser.Filename );
  19. // Copy the contents into the logTextView
  20. logTextView.Buffer.Text = file.ReadToEnd();
  21. // Set the MainWindow Title to the filename.
  22. this.Title = "Nate's Log Viewer -- " + chooser.Filename.ToString();
  23. // Make the MainWindow bigger to accomodate the text in the logTextView
  24. this.Resize( 640, 480 );
  25. // Close the file so as to not leave a mess.
  26. file.Close();
  27. } // end if
  28. chooser.Destroy();
  29. } // end method OnOpen
  30. For the OnClose method:
  31. protectedvirtualvoid OnClose(object sender, System.EventArgs e) {
  32. // Reset the logTreeView and change the window back to original size
  33. int width, height;
  34. this.GetDefaultSize( out width, out height );
  35. this.Resize( width, height );
  36. logTextView.Buffer.Text = "";
  37. // Change the MainWindow Title back to the default.
  38. this.Title = "Nate's Log Viewer"; }
  39. // end method OnClose
  40. For the OnAbout method:
  41. protectedvirtualvoid OnAbout(object sender, System.EventArgs e) {
  42. // Create a new About dialog
  43. AboutDialog about = new AboutDialog();
  44. // Change the Dialog's properties to the appropriate values.
  45. about.Name = "Nate's Log Viewer";
  46. about.Version = "1.0.0";
  47. // Show the Dialog and pass it control
  48. about.Run();
  49. // Destroy the dialog
  50. about.Destroy(); }
  51. // end method OnAbout

其实可以更加完善,比如再新建文档或者关闭文档的时候检测textview内容是否改变,提示用户保存等等功能。

编译运行界面:

使用开源工具MonoDevelop开发GTK#图形界面的更多相关文章

  1. Linux C 程序 GTK+图形界面编程(22)

    GTK+图形界面编程 Linux大多是在字符界面,但也可以开发图形界面 目前已经存在多种Linux下开发图形界面的程序开发包:最常用的是Qt和GTK+ Qt是一个跨平台的图形界面开发库,不仅仅支持Li ...

  2. 在ubuntu上使用wxWidgets成功开发一个图形界面程序

    编译wxWidgets 下载最新版的源码,wxWidgets-3.0.2.wxWidgets在liunx是通过wxGTK实现的.wxGTK和wxWidgets的源码打包在一起.wxGTK依赖GTK+, ...

  3. 2018-09-28 用Python3和tkinter开发简单图形界面程序

    源码库: program-in-chinese/wubi_code_editor 起因在这里. 由于此项目和汉字相关, 个人也想尝试Python的图形界面开发, 于是开始尝试. 遇到的一个坑. 用户测 ...

  4. 在windows下使用Qt5开发GTK3图形界面应用程序

    首先,去MSYS2官网下载MSYS2环境并安装在C:/mysys64下,我安装的是64位的. 进入MSYS命令行执行: pacman -S mingw-w64-x86_64-gtk3 pacman - ...

  5. Delphi - 让Delphi10.2在Windows下开发的图形界面程序运行在64位Linux中!

    FmxLinux官网:https://fmxlinux.com/ 参考: http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Linux_Applica ...

  6. linux图形界面 KDE、GNOME

    1.Linux图形桌面系统组成(由上往下层次结构) 窗口管理器——Enlightenmen.icewm.Fvwm.window-maker 桌面环境———Gnome.KDE.CDE X WINDOW— ...

  7. CentOS6.x 图形界面(gnome)安装

    CentOS6默认的安装选项 Desktop :基本的桌面系统,包括常用的桌面软件,如文档查看工具. Minimal Desktop :基本的桌面系统,包含的软件更少. Minimal :基本的系统, ...

  8. 使用代码生成工具快速开发ABP框架项目

    在一般系统开发中,我们一般要借助于高度定制化的代码生成工具,用于统一代码风,节省开发时间,提高开发效率.不同的项目,它的项目不同分层的基类定义不同,我们需要在框架基类的基础上扩展我们的业务类代码,尽量 ...

  9. Java GUI图形界面开发工具

    Applet 应用程序     一种可以在 Web 浏览器中执行的小程序,扩展了浏览器中的网页功能. 缺: 1.需要下载 Applet 及其相关文件 2.Applet 的功能是受限制的 优: 3.无需 ...

随机推荐

  1. 【hdu2196】Computer

    hdu 2196 computer 题意 给你一棵树,边有权值. 对于每一个点,求其与其距离最远的点的距离. 分析 思路1:树的直径 利用直径的性质进行求解,网上资料很多,这里不赘述. #includ ...

  2. 【BZOJ 2818】Gcd - 筛法求素数&phi()

    题目描述 给定整数,求且为素数的数对有多少对. 分析 首先筛出所有的素数. 我们考虑枚举素数p,统计满足的个数,等价于统计的个数,即统计以内满足互质的有序数对个数. 不难发现,也就是说,我们只要预处理 ...

  3. 关于js中变量声明和作用域的理解

    1. var是声明一个变量:虽然声明了这个变量,但在存入值之前,它的初始值是 undefined:2.全局变量:拥有全局作用域,在js代码中的任何地方都是有定义的:3.局部变量:在函数内声明的变量只在 ...

  4. Ubuntu配置Open BlockChain

    /* 以前只是听说过BlockChain,没怎么了解过,最近导师在搞Blockchain,让我配一下Open BlockChain的环境,于是就硬着头皮配了一下,还挺顺利的. 由于没接触过BlockC ...

  5. python 基础学习(字典对象,set对象)

    1.dict 字典对象 a.定义对象 d={'a':14,'b':12}b.通过key获取value d['a'] 方法1.判断key是否存在 if 'a' in d: d['a']方法2:通过用ge ...

  6. Spring 框架整理

    在web.xml中配置以下内容 <!-- 配置Spring MVC DispatcherServlet --> <servlet> <servlet-name>MV ...

  7. Android 适配器

     Adapter是连接后端数据和前端显示的桥梁,是数据和UI(View)之间的纽带.     在常见的View(ListView,GridView)等地方都需要用到Adapter.数据.Adapter ...

  8. BZOJ1570 [JSOI2008]Blue Mary的旅行

    建分层图,每一层表示一天的情况 从S向第0层的1号点连边,每层的n向T连INF的边 枚举天数,每多一天就多建一层然后跑最大流,如果当前流量大于人数则输出答案 由于路径长度不会超过n,因此tot个人走这 ...

  9. JS中把字符串转成JSON对象的方法

    在JS中,把 json 格式的字符串转成JSON对象,关键代码 json = eval('('+str+')'); <!DOCTYPE html PUBLIC "-//W3C//DTD ...

  10. 如何在Hadoop的MapReduce程序中处理JSON文件

    简介: 最近在写MapReduce程序处理日志时,需要解析JSON配置文件,简化Java程序和处理逻辑.但是Hadoop本身似乎没有内置对JSON文件的解析功能,我们不得不求助于第三方JSON工具包. ...