编程 Roma Widget Set (C# X11) - 一个零依赖的 GUI 应用程序框架 - 引言






4.93/5 (40投票s)
如何高效地充分利用 C# 中的 Roma 小部件集,而无需依赖 GTK 或 KDE 等 GUI 框架。基本概念和描述。
下载完整项目,旧版本 0.10、0.20、0.30、0.40、0.50、0.60、0.70、0.80、0.90 32 位 (zip)。
下载完整项目,旧版本 0.10、0.20、0.30、0.40、0.50、0.60、0.70、0.80、0.90 64 位 (zip)。
下载 Xrw API 文档 (HTML 格式) 版本 V1.00 (zip)
引言
本文介绍 **Roma Widget Set** (Xrw),这是一个 C# GUI 应用程序框架,它直接基于 X11 库调用。Roma Widget Set 的想法源于关于 Xlib/X11/Xt/Xm 的第一篇文章 Programming Xlib with Mono Develop - Part 1: Low-level (proof of concept),并受到了后续文章 Programming Xlib with Mono Develop - Part 2: Athena widgets (proof of concept)、Programming Xlib with Mono Develop - Part 3: Motif widgets (proof of concept) 和 Programming Xlib with Mono Develop - Part 4: FWF Xt widgets 编写经验的影响。
零依赖的承诺意味着,它只需要免费 Mono 标准安装的程序集和免费 X11 发行版的库;它不特别需要 GNOME、KDE 或任何商业库。
由于整个主题已经超过 50 页打印内容,我决定将其拆分为三部分,使用 ,并分为四部分,使用
。使用
,我将完整的 API 描述移至单独的 HTML 文档(这是 Xrw 项目的一部分),并重构了所有四篇文章,使阅读更具趣味性和吸引力。
本文:Roma Widget Set (C# X11) 编程 - 一个零依赖的 GUI 应用程序框架 - 简介。包含对小部件集功能的简要说明。(在
之前,内容是:〜基本概念。包含通用描述。)本文应始终是首选的起点。
第一个拆分出的文章:Programming the Roma Widget Set (C# X11) - a zero dependency GUI application framework - Widget set。由于“枯燥”的 API 文档不断增长,API 文档已随
移至单独的 HTML 文档(这是 Xrw 项目的一部分),并且本文专注于所有小部件的简要介绍。(在
之前,内容是:〜固有小部件。仅包含固有小部件的完整功能 API 参考描述。)
第二个拆分出的文章:Programming the Roma Widget Set (C# X11) - a zero dependency GUI application framework - Programming techniques。由于“枯燥”的 API 文档不断增长,API 文档已随
移至单独的 HTML 文档(这是 Xrw 项目的一部分),并且本文专注于编程技术。(在
之前,内容是:〜简单小部件。仅包含简单小部件的完整功能 API 参考描述。)
第三个拆分出的文章:Programming the Roma Widget Set (C# X11) - a zero dependency GUI application framework - MVVM/XAML support。由于“枯燥”的 API 文档不断增长,API 文档已随
移至单独的 HTML 文档(这是 Xrw 项目的一部分),并且本文专注于介绍 Xrw 的 MVVM/XAML 支持。(在
之前,内容是:〜复合小部件。仅包含复合小部件的完整功能 API 参考描述。)
本文提供了一个 32 位和 64 位示例应用程序的完整解决方案。稍后描述的所有功能都可以标记为
|
|
首先 - 主要缺点
- 整个 GUI 应用程序框架是定制的 - 背景没有庞大的开发者社区。
- 该框架仅利用 C# 和 X11(通过 P/Invoke)的能力 - 目前不涉及 Xt、Xpm、Xft、Cairo、Pango、... 等附加库,也不涉及 XRENDER(用于 Alpha 混合和颜色渐变支持)、DOUBLE_BUFFER(用于无闪烁绘制昂贵内容)、DAMAGE(用于更好的暴露处理)、XInputExtension(用于手势支持)等 X11 扩展...。因此,绘图能力有限(不支持原生颜色渐变、不支持字体抗锯齿),用户交互能力也有限(不防闪烁、不支持手势)。
- 它是平台相关的 - 仅在 X11 上运行。
- 没有 GUI 设计器。
- 从
开始,仅完全支持 24 位颜色模型(16,777,216 色,每像素 32 位)。16 位颜色模型(65,536 色,每像素 16 位)自
起支持,但未为减少的颜色空间提供任何颜色优化或平滑处理。
其次 - 主要优点
- 该框架小巧,内联文档齐全,易于根据特定需求进行采用/扩展。此外,完整的 API 参考 HTML 文档是 Xrw 项目的一部分。
- 该框架随附完整源代码,完全用 C# 编写 - 框架的所有部分都可以由单个 C# 解决方案或项目维护。
- 该框架除 X11 外没有其他依赖项,并且零开销。它非常轻量级且快速。
- 该框架
开始提供一些 Athena 小部件集所没有的、甚至某些 Motif 或 GTK 所没有的小部件。第一个是基本的 ribbon,接着是属性网格。
- 该框架核心拥有一个 XAML 包装器(在
中引入),并已优化以支持 MVVM 模式。这使得平台无关的开发(Windows 和 UNIX/LINUX)成为可能,即使该框架仅限于 X11,并且在 UNIX/LINUX 的 GUI 框架中目前是独一无二的。
此枚举会引发问题
- 为什么不利用 GTK#?GTK# 的当前稳定实现仍然基于 GTK 的 2.12 版本。有一个基于 GTK 2.24 的不稳定的 GTK# 实现,并且基于 GTK 3.xx 的 GTK# 实现(GTK# 版本 2.99)已经开发了两年多而没有取得实质性进展。总而言之 - GTK# 非常稳定(几个大型应用程序依赖它,例如 MonoDevelop),集成在 GTK 的主页上并且文档齐全(通过 Mono 的 API 文档),但它或多或少已过时,GTK 的“C”API 的过程式根源通过 C# 包装器显现出来 - 非常重要 - 它不是平滑的 .NET 集成(例如,模型的数据绑定不可用)。在我看来,这是 Xrw 项目的最佳替代方案。
- 为什么不利用 Qt#/Qyoto/QtSharp?Qt 的 C# 绑定库的历史和当前状态非常混乱。它们没有一个有自己的主页或集成到 Qt 的主页中。新的 Qt 版本 5.x API 不受支持,并且它们不提供平滑的 .NET 集成(例如,信号/槽机制与 .NET 事件分开)。
- 为什么不利用 Mono 对 System.Windows.Forms 的实现?即使有大量的文档和示例,开发也已宣布完成,尚未实现与 .NET 的完全兼容性,也不可能实现,并且该技术已过时。
- 为什么不使用 Moonlight?它已被弃用,其原型 Silverlight 也已停产。
- 为什么还要有另一个 GUI 应用程序框架(而不是 wxWidgets、FLTK、FOX 或类似的东西)?到目前为止提到的 GUI 框架都不支持 MVVM/XAML。处理这种复杂倡议带来的挑战很有趣。应用程序可以达到的独特性以及为特定应用程序设计不常见 GUI 的灵活性是无与伦比的。唯一目前非常有前景的替代方案似乎是刚起步的 MonoGame。我将关注它的进展和功能。
没有计划将该框架运行在 X11 以外的平台 - 具有所需语法和功能、尽可能接近 Microsoft® 原版的 MVVM/XAML 支持是实现平台独立性的更好方式。可能未来的版本将基于比 X11 更现代的 API,例如 CLUTTER。
目前我计划在 1.0 版本结束这个项目,并开发一个“下一代”Roma Widget Set,引入一些新方面:1:绘图应支持渐变色和抗锯齿文本(通过 Cairo 库或 XRENDER 等 X11 扩展),如有必要,与 Pango 或 Xft 库合作。2:GUI 定义的 XAML/MVVM 支持应达到一个水平,使开发人员能够并行开发 X11 和 Windows 应用程序,尽可能使用可移植的代码(XAML 和 C#)。
背景
(1) Roma Widget Set 的设计旨在支持小型工具的简单 GUI 编程。其重点在于应用程序的效率,而不是很少使用的功能的完整性。
有什么替代方案?
所有其他原生 X11 或平台无关的小部件集或 GUI 应用程序框架 - Athena 小部件集及其后代(例如 neXtaw、XawM、Xaw-Xpm、XawPlus 或 Xaw3d)、Motif 小部件集(Open Motif 或 LessTif)、GTK(GTK+ 已有 C# 包装器 GTK#)、KDE(Qt 已有 C# 包装器 Qt#(过时)、Qyoto(过时)和 QtSharp)、wxWidgets、FLTK 和 FOX - 都是用 C/C++ 开发的,在 C# 项目中很难针对特定目的进行采用/扩展。
Roma Widget Set GUI 应用程序框架应通过原生 C# 代码支持所有采用/扩展,集成 .NET 框架组件,并提供原生的 .NET 感觉。
这不是一个新想法/要求。*DotGNU Portable.NET* 项目 - 随着其父项目 *DotGNU* 于 2012 年 12 月关闭而消失 - 包含 *pnetlib*,该项目由 Rhys Weatherley(当时是 *Southern Storm Software, Pty Ltd* 的董事)等人于 2007 年 3 月之前一直积极开发。pnetlib 项目的最后一个版本(0.8.0)包含 *Xsharp* 和 *System.Windows.Forms* 等。虽然 *Xsharp* 实现了一个从 C# 编程 X11 的基本框架(可能值得一看),但 *System.Windows.Forms* 是 Microsoft 不符合 ECMA 标准的命名空间的重新实现,并且一直存在关于 Microsoft 是否可能通过专利诉讼来摧毁此类 C# 实现的讨论和警告。
(2) Roma Widget Set 框架无意重新实现(API 兼容)任何已知 GUI 框架。但是,从 开始,Roma Widget Set 框架获得了一个 XAML 包装器,提供了一个 WPF/MVVM 模式兼容的 XAML 层,并且现在(作为其原生 C# API 的替代方案)可以通过 XAML 访问,其语法和功能尽可能接近 Microsoft® 原版。
这引入了一个新的设计目标:支持跨平台 GUI 的编程。其重点是几乎完全的 Microsoft® 兼容性,而不是很少使用的功能的完整性。
有替代方案吗?
所有其他小部件集或 GUI 应用程序框架 - Athena 小部件、Motif、GTK(GTK#)、KDE( Qt#/Qyoto/QtSharp)、wxWidgets (wx.NET) FOX、FLTK 和 V- 坚持其传统 API,不支持 MVVM 模式和 XAML。
使用代码
示例应用程序使用 Mono Develop 2.4.1 针对 Mono 2.8.1(构建于 2010-11-17)在 OPEN SUSE 11.3 Linux 32 位 EN 和 GNOME 桌面环境下编写。移植到任何较旧版本或任何较新版本都不应有问题。示例应用程序的解决方案由三个项目组成(完整源代码已提供下载)
- X11Wrapper 为 Xlib/X11 调用 libX11.so 定义了函数原型、结构和类型。
- Xrw 包含 Roma Witget Set (Xrw) 和(自
起引入)API 的 HTML 文档。
- X11 包含示例应用程序。
示例应用程序也经过 Mono Develop 3.0.6 针对 Mono 3.0.4(构建于 2013-02-02)在 OPEN SUSE 12.3 Linux 64 位 DE 和 GNOME 桌面环境、IceWM、TWM 和 Xfce 下的测试。
32 位和 64 位解决方案之间的唯一区别是某些 X11 特定数据类型的定义,正如本系列第一篇文章中所述。
建议:要在 MonoDevelop 中使用类库文档快捷方式 (F1),必须安装 "mono-tools" 包。
主应用程序窗口
图像显示了使用 XrwTheme.GeneralStyle.WinClassic
的示例应用程序。
图像显示了使用 XrwTheme.GeneralStyle.Gtk2Clearlooks
的示例应用程序。
示例应用程序演示了
- 一个在 A 区域的 **ribbon** 小部件,带有三个 ribbon,演示了
- 一个 **ribbon 应用程序菜单**,
- 三个 **ribbon 选项卡**(Dialog test、Radio & toggle test、Split test),
- 多个 **ribbon 面板**(Large buttons、Medium buttons、...),
- 多个 **ribbon 按钮**(File dialog、...),
- 多个 **ribbon 分离按钮**(Font、Color、...),
- 第二个 ribbon 选项卡上的多个 **ribbon 控件组**(水平文本对齐、垂直文本对齐、粗细和倾斜、上标和下标),
- 第二个 ribbon 选项卡上的多个 **ribbon 控件组单选节点**和 **ribbon 控件组切换节点**(左、中、两端对齐、右、...),
- B 区域的顶部选项卡式 **notebook** 小部件,带有两个选项卡,
- 第一个选项卡包含一个水平 **paned** 小部件,左侧是 **tree** 小部件,右侧是 **property** 网格,
- 第二个选项卡包含一个水平 **paned** 小部件,左侧是 **list** 小部件,右侧是 **property** 网格,
- C 区域的底部选项卡式 **notebook** 小部件,带有四个选项卡,
- 第一个选项卡包含一个 **menu** 小部件和一个 **command** 小部件,
- 第二个选项卡包含三个 **toggle** 按钮小部件,
- 第三个选项卡包含三个 **radio** 按钮小部件,
- 第四个选项卡包含一个**水平 spin button**、一个 **combo box** 和一个 **link** 按钮,
- 第五个选项卡包含一个 **text** 小部件,
- D 区域的 **label** 小部件,
- 调用所有可用的 **标准对话框**,例如
- 基于 X11 字体规范的 **位图和矢量字体对话框**,由
引入,
- GTK/Windows 风格的 **字体对话框**,由
引入,
- 文件对话框,由
引入,
- 带有 8x2 和 2x8 可选颜色的**颜色选择器对话框**,由
引入,
- 颜色选择对话框,由
引入,
- 消息框,由
引入(包括标记,由
引入),
- 基于 X11 字体规范的 **位图和矢量字体对话框**,由
- 调用单个对话框以演示
- 多个基于 **dock panel** 的布局,由
引入,
- 在 **canvas** 上进行简单的绘图,由
引入,
- 在 **image** 上进行简单的绘图,由
引入,以及
- 一个基于 **uniform grid** 的布局,由
引入。
- 多个基于 **dock panel** 的布局,由
小部件集标准对话框
示例应用程序在 ribbon 的应用程序菜单中提供了“Open”和“Save as”菜单项,用于测试“文件选择”对话框 XrwFileSelectionDialog
。
示例应用程序提供了 ribbon 分离按钮“Font | X11 dialog”和“Font | GTK/Windows dialog”,用于测试“字体选择”对话框 XrwBitmapAndVectorFontSelectionDialog
和 XrwFontSelectionDialog
。
示例应用程序提供了 ribbon 分离按钮“Color | Selector 2x8 dialog”、“Color | Selector 8x2 dialog”和“Color | Chooser dialog”,用于测试“颜色选择”对话框 XrwColorSelectionDialog
和 XrwColorChooseDialog
。
示例应用程序提供了 ribbon 分离按钮“Info | About dialog”和“Info | Help dialog”,用于测试“消息框”对话框 XrwMessageBox
。
示例应用程序的单个对话框
示例应用程序提供了 ribbon 分离按钮“Layout | Dock top first bottom second”、“Layout | Dock top first left secondHelp dialog”、“Layout | Dock left first right second”和“Layout | Dock left first top second”,以展示演示 XrwDockPanel
功能的对话框。
示例应用程序提供了 ribbon 分离按钮“Layout | Simple drawing on canvas”,以展示演示 XrwCanvas
结合 XrwArcFigure
、XrwEllipseFigure
、XrwLineFigure
、XrwPathFigureCollection
和 XrwRectangleFigure
功能的对话框。
示例应用程序提供了 ribbon 分离按钮“Layout | Simple drawing on image”,以展示演示 XrwImage
功能的对话框。
示例应用程序提供了 ribbon 分离按钮“Layout | Uniform grid”,以展示演示 XrwUniformGrid
功能的对话框。
想法积压
想法 | 出现 | 已解决 |
添加 ComboBox 小部件和 SpinMenu。 | 版本 0.1 | 版本 0.2 |
添加 SpinButton 小部件。 | 版本 0.1 | 版本 0.2 |
添加对 16 位颜色模型支持。 | 版本 0.1 | 版本 0.2 |
添加一个类似于 GTK/Windows 的字体选择对话框(适用于 I18N 文本输出,使用字体集而非字体) | 版本 0.1,已刷新版本 0.5 | 版本 0.7 |
添加缺失的静态 Xrw <align>Notebook 工厂方法 New BottomTabedNotebook 。 | 版本 0.1 | 版本 0.3 |
从 8 位字符串更改为 16 位字符串绘图,以支持超过 ASCII 的字符(I18N 文本输出) | 版本 0.2 | 版本 0.6 |
添加一个简单的初始颜色对话框。 | 版本 0.2 | 版本 0.5 |
添加一个基本的 ribbon 小部件。 | 版本 0.2 | 版本 0.3 |
添加缺失的静态 Xrw <align>Notebook 工厂方法 NewLeftTabedNotebook 和 NewRightTabedNotebook 。 | 版本 0.3 | |
添加一个 paned 小部件。 | 版本 0.3 | 版本 0.4 |
添加一个 grid form 小部件。 | 版本 0.3 | 版本 0.4 |
添加一个基本的 property grid 小部件。 | 版本 0.3 | 版本 0.4 |
为小部件添加工具提示。 | 版本 0.3 | 版本 0.9 |
为 ribbon 添加增强的工具提示。 | 版本 0.3 | |
添加一个带标签的 frame 小部件。 | 版本 0.3 | |
添加一个输入对话框。 | 版本 0.4 | |
添加替代列表视图(小图标、大图标、列表和详细信息)。 | 版本 0.4 | 版本 0.5 |
添加更高级的颜色对话框。 | 版本 0.5 | 版本 0.6 |
在 XrwFileSelectionDialog 周围添加便捷包装器 XrwOpenFileDialog 和 XrwSaveFileDialog 。 | 版本 0.5 | |
为 XrwText 添加剪切/复制/粘贴功能。 | 版本 0.5 | 版本 0.6 |
支持通过 XAML 进行简单的 GUI 定义以证明概念。 | 版本 0.6 | 版本 0.7 |
添加多行编辑器。 | 版本 0.7 | |
支持菜单项的子菜单。 | 版本 0.8 | |
添加基本打印功能。 | 版本 0.8 | |
将小部件/小配件坐标从基于 Int32 的值更改为基于 Double 的值 | 版本 0.9 | |
使绘图更接近 Cairo.Context | 版本 0.9 |
修复的错误
在 中修复
- 修复了 XrwShell 子项的双重绘制问题。
- 添加了派生自 XrwCore 的小部件的缺失背景颜色初始化。
- 修复了
X11Graphic
构造函数参数individualColormap
和graphicDepth
从application.IndividualColormap
和application.ColorDepth
到IntPtr.Zero
和defaultColordepth
(使用根窗口的颜色图和深度,而不是应用程序的颜色图和深度),并修复了X11Graphic.CreateIndependentGraphicPixmap()
/X11Graphic.CreateIndependentMaskPixmap()
方法参数window
从application.Window
到defaultRootWindow
在XrwApplicationFramework.SetWmShellIcon()
中。两者都支持 16 位颜色模型是必需的。 - 修复了
X11Graphic.CreateIndependentGraphicPixmap()
中X11lib.XCreateGC()
方法参数x11drawable
从window
到pixmap
。这对于支持 16 位颜色模型是必需的。
在 中修复
- 在应用程序关闭期间发生的异常已修复,如果任何
XrwOverrideShell
当前弹出,则现在父子列表的集合处理是正确的。(XrwOverrideShell
的处置意味着将其从父子列表中移除 - 这会改变子列表集合。) - 修复了
X11Graphic.StockIcon.Information16
的大小从 18x18 到 16x16。 - 修复了
XrwVisibleRectObj.ExpandToAvailableHeight
、XrwVisibleRectObj.ExpandToAvailableWidth
、XrwVisibleRectObj.ExpandToMaxSiblingHeight
和XrwVisibleRectObj.ExpandToMaxSiblingWidth
在任何固定尺寸上的行为,现在如果分配了固定高度/宽度,则抑制设置为true
。 - 修复了
XrwVisibleRectObj.
SetFixedHeight
和XrwVisibleRectObj.
SetFixedWidth
在任何尺寸扩展设置时,现在如果先前为true
,则将XrwVisibleRectObj.ExpandToAvailableHeight
和XrwVisibleRectObj.ExpandToAvailableWidth
或XrwVisibleRectObj.ExpandToMaxSiblingHeight
和XrwVisibleRectObj.ExpandToMaxSiblingWidth
重置为false
。 - 修复了
XrwRectObj.GeometryManagerAccess.SetAssignedGeometry()
对于固定高度的赋值,现在XrwVisibleRectObj.FixedSize.Height
被正确应用 - 仅当XrwVisibleRectObj.IsFixedHeight
为 true 时。
在 中修复
- 修复了
XrwTree
的PreferredSize()
计算。 - 修复了
XrwVisibleRectObj.DrawFrame()
中的绘制错误。一像素的边框现在不会超出右/下坐标。 - 修复了
X11Graphic.StockIcon.Question16
和X11Graphic.StockIcon.Error16
的大小从 18x18 到 16x16。 - 修复了
XrwFileSelectionDialog
的高度自适应。宽度自适应已经正确。现在对话框的高度变化会导致地点和文件视图的高度变化。 - 修复了
XrwBitmapAndVectorFontSelectionDialog
的高度自适应。宽度自适应已经正确。现在对话框的高度变化会导致字体样式、字体分辨率和字体大小视图的高度变化。 - 修复了树节点折叠或展开时,包含
XrwTree
的XrwViewport
的滚动条更新。现在XrwTree
调用已注册的SizePreferenceChanged
委托。 - 修复了管理器小部件在管理器小配件内的定位。例如,位于垂直
XrwBox
小配件内的(水平)XrwPaned
小部件被正确放置。现在GeometryManagerAccess.SetAssignedGeometry()
方法不仅将小部件的指定位置重置为 0,0,还重置其子项的位置偏移。这是因为小部件有自己的 X11 窗口,所有位置都必须相对于窗口测量。 - 修复了应用程序工作文件夹与安装文件夹不同的崩溃问题。现在
X11Graphic
加载器在工作文件夹中找不到图形文件时,也会在安装文件夹中查找。
在 中修复
- 修复了
XrwViewport
的CalculateChildLayout()
计算。对于大小只需要一个滚动条的子项,并且此滚动条的显示减少了可用大小,以至于需要第二个滚动条,现在将显示第二个滚动条。 - 修复了 GUI 部分的重绘问题,这些部分被
XrwSimpleMenu
(或其派生类XrwSpinMenu
和XrwDropDownCellEditorShell
)遮挡(覆盖),并在菜单关闭后重新显示,如果任何选定的XrwSme
调用对话框。(这是因为对话框(XrwDialogShell/XrwTransientShell/XrwWmShell)实现了内部事件处理循环。)现在 sme 的OnButtonReleased
委托不会直接由 sme 的 ButtonRelease 事件调用,而是会生成一个 CustomMessage 事件,该事件会进入消息队列的末尾。CustomMessage 事件仅在 sme 的OnButtonReleased
委托轮到它时(在消息队列中)调用。此过程保证在 sme 的 ButtonRelease 事件之前处理任何菜单的 Unmap 事件。
在 中修复
- 修复了
XrwComboBox
选定值显示错误的问题。选择更改后,会显示旧值而不是新值。此问题是由修复号 2 引起的。由 sme 的 ButtonRelease 事件生成的 CustomMessage 未正确处理,因为
XrwSpinMenu
已作为子项和关联 shell 注册到XrwApplicationShell
两次。现在XrwSpinMenu
只注册为关联 shell。 - 修复了
XrwGridForm
的MinimumSize()
和PreferredSize()
中的计算错误。现在考虑了左右/顶部/底部的边距和子项大小(对于动态宽度列/动态高度行)。 - 修复了
XrwScrollBar
的指针移动行为。现在,即使拇指(thumb)在向上/向下按钮或滑动区域内,但超出拇指区域的MotionNotify
事件也不会混淆拇指位置计算。 - 修复了
XrwText
的撤销 ([Ctrl] + [z])/重做 ([Ctrl] + [y]) 行为。现在,对多字符插入的撤销命令会删除所有插入的字符(不仅仅是第一个),并且现在所有重做命令(无论删除还是插入单个字符或多字符)都将在原始选择和插入符位置(而不是当前选择和插入符位置,如果它们已移动)执行,并在操作后正确恢复选择和插入符位置。 - 修复了
XrwBox
和XrwSpinBox
的错误PreferredSize
计算。现在考虑了子项的ExpandToMaxSiblingWidth
和ExpandToMaxSiblingHeight
标志。 - 修复了
XrwGridFrame
的错误CalculateGridGeometry
计算。现在考虑了BorderWidth
。 - 修复了
XrwGridFrame
的错误CalculateMinimumSize
和CalculatePreferredSize
计算。现在对于FixedDimension
列/行不再考虑Margin
。 - 修复了
XrwLabelBase
的子类(包括XrwComboBox
、XrwLabel
、XrwLabelAndColor
、XrwTextSpinButton
、XrwToggle
)以及XrwText
的错误PreferredSize
计算。现在考虑了FixedSize
。 - 修复了
XrwMenuButton
的错误菜单注册。现在,对于作为XrwDialogShell
子项的XrwMenuButton
,内置菜单的注册也有效。 - 修复了
XrwOverrideShell
在Realize
和Unrealize
期间到父XrwWmShell
的错误注册/注销。现在,对于作为XrwDialogShell
子项的XrwOverrideShell
,注册/注销也有效。 - 修复了
XrwViewport
的HScrol.
ThumbPageWidth
和VScroll.T
humbPageWidth
属性在CalculateChildLayout
期间的计算错误。现在T
humbPageWidth
被计算为视口裁剪大小的一部分,而不是倍数。 - 修复了
XrwRibbonAppMenu
遮挡的 GUI 部分的重绘问题,并在菜单关闭后重新显示,如果任何选定的XrwSme
调用对话框。(请参阅“在中修复”第 2 条)。
在 中修复
- 修复了
XrwList
和XrwTree
在使用基于XrwDropDownCellEditorShell
的默认编辑器编辑枚举值后显示错误的问题。选择新值后,仍然显示旧值而不是新值。现在显式调用重绘。 - 修复了
XrwComboBox
的XrwSpinMenu
旋转前进/旋转后退功能中的错误。每次单击旋转按钮后,菜单就会关闭。此错误自起未被发现,当时
XrwSimpleMenu
引入了HandleParentRoutedClientMessage()
(请参阅“在中修复”第 2 条)。
在 中修复
- 修复了
XrwVisibleRectObj
的DrawTextLineAutoLineBreak()
方法中的无限循环,如果小部件/小配件宽度小于单个字符的宽度。 - 修复了
XrwWmShell
及其派生类的重绘问题。在所有子项都是小配件的情况下,使用新尺寸 < 旧尺寸的配置事件之后,X11 服务器不会生成暴露事件。在这种情况下,必须手动生成暴露事件。 - 修复了
XrwLabel
及其派生类的非活动小部件/小配件文本的绘制。自引入
StyleText
以来,每个文本样式都设置了前景色。现在,非活动小部件/小配件的文本为所有文本样式保持前景色不变。 - 修复了应用程序不完全终止的问题,如果应用程序窗口在任何对话框打开时关闭。对话框(瞬态 shell)接管应用程序 shell 的(无限)消息循环处理。关闭应用程序窗口会为每个关联的瞬态 shell 调用
DefaultClose()
。瞬态 shell 必须覆盖DefaultClose()
方法来停止其(无限)消息循环处理。 - 修复了
X11lib.XColor
的结构布局。红色、绿色和蓝色颜色的值为X11.TUshort
(0-65535)类型,而不是X11.TUchar
(0-255)。 - 修复了空闲消息队列上的高 CPU 负载(约 50% 的两个核心)。挂起的
ConfigureEvent
的评估会立即从XrwApplicationShell.DoEvent()
消息队列评估返回,而不是在找到并处理任何挂起的ConfigureEvent
后才返回。现在 CPU 负载低于 1%(对于两个核心)。 - 修复了
XrwSpinBox
导航的显示错误。对于任何作为瞬态 shell 一部分的XrwSpinBox
,如果任何旋转按钮的外观被关闭(即使是临时的),导航会在应用程序 shell 的左上角导致显示错误。从XrwSpinBox
中移除的所有旋转按钮都已重新父级化到ApplicationShell
,并在其Unrealize()
调用后在应用程序 shell 上产生显示错误。现在,移除的旋转按钮已重新父级化到WmShell
,并在其Unrealize()
调用后避免在应用程序 shell 上出现显示错误。 - 基于覆盖 shell 的弹出窗口(
XrwSimpleMenu
、XrwRibbonAppMenu
、XrwToolTipShell
、XrwBaseCellEditorShell
)及其派生类(XrwSpinMenu
、XrwDropDownCellEditorShell
、XrwGenericCellEditorShell
)不再通过RequestInputFocus()
获取焦点。因此,基于覆盖 shell 的弹出窗口不再触发(应用程序或对话框 shell,它们所属的)FocusOut
和(它们自身的)FocusIn
事件。因此,弹出窗口所属的应用程序或对话框 shell 不会失去活动窗口框架 - 并且不会因显得不活动而感到困惑。相反,XrwApplicationShell
中的键事件处理优先处理已注册的覆盖 shell。 - 从(几乎)所有控件中移除了
INotifyPropertyChange
的实现,因为 Microsoft® 原版不为控件实现INotifyPropertyChange
。
在 中修复
- 修复了
XrwDockPanel
的MinimumSize()
和PreferredSize()
的计算。对没有DockStyle
的子项的后备处理已打补丁,并注意到了具有DockStyle.Fill
的子项的高度影响。 - 修复了错误的
X11lib.XSync()
调用。许多调用X11lib.XSync()
时参数discard
设置为(X11.TBoolean)1
。这是错误的,因为它会丢弃所有已同步到事件队列的事件。参数discard
设置为(X11.TBoolean)1
应该是绝对例外。这也可能对所有类型的弹出窗口、XrwOverrideShell
派生类以及XrwTransientShell
派生类产生积极影响。 X11.TBoolean
被定义为映射sbyte
,但 X11/Xlib.h 将Bool
定义为int
。这已得到修复,现在X11.TBoolean
被定义为映射int
。- 修复了在关闭模态对话框后立即打开另一个模态对话框时发生的崩溃。有时输入焦点无法设置到新打开的模态对话框,因为在 X 客户端请求 shell 的输入焦点时,
XrwDialogShell
尚未被 X 服务器映射。 XrwPathFigureCollectionGeometry.Bounds
属性仅考虑了多个图形中最后一个X11.IPathFigure
的边界,现在已修复。System.Windows.Media.PathGeometry.TryParsePathData()
方法未能正确解析同一类型的连续路径段(移动到、直线到、曲线等),这些段不重复段代码(M、L、C、...)。不重复段代码是根据定义允许的,现在将得到正确处理。XrwGridForm.CalculateChildLayout()
方法未能捕获超出范围的行/列。现在已修复,并且超出范围的行/列将回退到有意义的值。XrwRectObj.KeyPress
和XrwRectObj.KeyRelease
事件被发送了两次给XrwApplicationShell
,因为XrwApplicationShell
在遍历小部件层次结构时处理了一次,以及作为后备,如果没有事件委托标记了该事件以停止进一步处理,则再次处理。现在已抑制后备,如果事件已在遍历小部件层次结构期间发送给XrwApplicationShell
。- 自从
移除了(几乎)所有控件的
INotifyPropertyChange
实现以来,提供了一个替代实现,并且DependencyProperty
绑定可以再次工作。 - 修复了
X11.Text.TextStyle
类构造函数中的标记解析器中的一些小错误。现在<s>
(删除线)和<u>
(下划线)工作正常,并且不再发生不必要的(与先前样式无变化)X11.Text.Style
创建。 XrwFileSelectionDialog
显示“Default”作为地点列表和文件列表的列名。现在已修复为“Folder names”和“File names”。
临时结果 : Xrw 小部件/小配件接口的版本 1.00 非常可靠。所有已知错误都已修复。
但是:仍然缺少一些功能。特别是打印支持尚未实现,绘图能力已达到 X11 API 的极限。XAML/MVVM 方法在 GUI 创建方面效率更高,也更有趣。
这就是为什么我决定在接下来的几个版本中专注于 XrwXAML,并提供 Cairo 绘图以及 X11 绘图。Cairo 的替代方案将是 OpenGL/Mesa,但 Cairo 开箱即用地提供了 PDF(-> 打印)和 SVG 支持。
改进
在 中改进
- 通用的绘图方法,用于绘制滚动条的箭头、前进和后退按钮
XrwVisibleRectObj.DrawArrow()
。 X11lib.XAllocWMHints()
的新方法签名,现在返回WMHints
的非托管内存句柄和作为引用参数的已封送结构。这使得能够使用WMHints
的非托管内存句柄调用X11lib.Free()
。
在 中的改进
- 在
XrwApplicationShell.RemoveCild()
和XrwCore.DisposeByParent()
中移除事件队列中不必要的 X11 事件(刚被取消实现的 X11 窗口的事件)。 - 附加主题
XrwTheme.GeneralStyle.WinLuna
、XrwTheme.GeneralStyle.WinRoyale
和XrwTheme.GeneralStyle.WinMidori
。 - 对
XrwNotebook
的扩展,以支持底部标签。 - 一个 ribbon 小部件,支持应用程序菜单按钮/应用程序菜单、标签、面板、按钮、分离按钮和控件组以及主题。
在 中的改进
- 对
XrwViewport
的新可选列标题显示,如果Child
实现XrwIGridView
接口(如XrwList
和XrwTree
)。 XrwList
显示多列的能力,以及(如果嵌入在XrwViewport
中)可选的列标题。XrwTree
显示多列的能力,以及(如果嵌入在XrwViewport
中)可选的列标题。- 通过仅调用小配件(无自身窗口的子项)的
InvokeRedraw()
来减少XrwComposite
子项不必要的重绘(小部件无论如何都会从 WM 接收暴露事件)。 - 减少了应用程序窗口在调整大小时的闪烁(详情请参阅“事件处理的特定方面”)。
XrwTree
的多个根节点。- 添加了一个 paned 管理器小部件
XrwPaned
,它支持在父项大小不变的情况下调整子项大小,以及一个网格表单管理器小配件XrwGridForm
,它支持基于列/行的子项布局(包括列/行跨度功能以及固定或动态的列/行尺寸)。 - 用于设置用户定义字体规范的便利函数,以及将当前
DefaultFontName
显式分配给每个新创建的小部件的 GC(图形上下文)。 XrwList
和XrwTree
现在将布尔值显示为切换图像,而不是文本。- 为
XrwTree
添加了可编辑性(对于简单的属性网格小部件是必需的)。 - 添加了一个简单的属性网格小部件
XrwPropertyGrid
,它使用反射来确定要显示和编辑的属性。string
、bool
、ThreeState
和enum
类型的属性是可编辑的(利用提供的标准编辑器)。
在 中的改进
- 将专有数据类型
TSize
、TPoint
和TRectangle
替换为 System.Drawing.Size、System.Drawing.Point、System.Drawing.Rectangle 和一些扩展方法。 XrwList
现在除了ViewType.Details
外,还支持ViewType.List
、ViewType.SmallIcon
和ViewType.LargeIcon
视图类型。XrwList
现在支持多选。- 减少了在
XrwList
和XrwTree
内部鼠标移动时的闪烁。鼠标移动处理程序现在直接调用RedrawContent()
(而不是调用InvokeRedraw()
,后者总是先删除背景 - 导致闪烁 - 然后调用RedrawContent()
)。 - 为
XrwList
和XrwTree
添加了列调整大小功能。 - 为文本输出添加了剪裁,这对于
XrwList
和XrwTree
列调整大小到小于列首选大小非常重要。 - 为
XrwList
和XrwTree
添加了就地编辑,内置编辑器用于单行文本、布尔值、三态值和枚举。 - 引入
X11Surface
类来集中XrwVisibleRect
和派生小部件的所有渲染相关属性,并为将来轻松切换到“Cairo”渲染做准备(参见Programming Cairo text output beyond the 'toy' text API (C#/X11) - a prrof of concept)。 - 为
XrwList
和XrwTree
添加了列重新排序功能。 - 引入并专门使用新的静态日志类
SimpleLog
,通过 X11wrapper 解决方案实现,而不是使用不一致的Console.WriteLine()
调用。 XrwGridForm
现在覆盖了XrwComposite
的MinimumSize
和PreferredSize
方法,具有更合适的尺寸计算。
在 中的改进
- 现在支持国际文本输出 (I18N),前提是 C 运行时提供区域设置设置(
libc.setlocale
)并且配置为非"C"
和"POSIX"
的区域设置,并且 X 服务器支持国际化(X11ibc.XSupportsLocale
)。(这是通过使用XCreateFontSet
和XwcDrawString
而不是XLoadFont
和XDrawString
实现的。)否则,文本输出从 256 个字符集(ASCII)改进到 65535 个字符集(ISO),使用XDrawString16
而不是XDrawString
。 - 现在
XrwScrollBar
支持自动重复,不仅用于向上/向下按钮,还用于滑动区域。向上/向下按钮上的自动重复会触发步进移动。滑动区域上的自动重复会触发页面移动。 - 现在
XrwScrollBar
的工厂方法支持自定义ThumbMaxValue
,范围为 100 ...INITIAL_THUMB_MAX_VALUE
(1,000,000)。这提供了适应的值范围 - 例如,红/绿/蓝颜色分量,每个值范围为 0 ... 255。 - 现在
XrwText
支持(可选)RegEx
验证,并在有效值更改时触发ValueChanged
事件。它还支持通过剪贴板进行简单 STRING 数据的剪切([Ctrl] + [x])、复制([Ctrl] + [c])和粘贴([Ctrl] + [v])操作。 XrwApplicationShell
现在支持剪贴板事件SelectionNotify
(用于确定数据提供者是否支持 STRING 数据并将 STRING 数据合并到XrwText
小部件中)和SelectionRequest
(用于向数据请求者提供支持的数据类型,并在请求时提供 STRING 数据)。XrwFileSelectionDialog
现在支持文件扩展名过滤器。其几何管理现在基于XrwGridForm
而不是嵌套的XrwBox
。现在可以通过XrwPaned
调整地点列表和文件列表的宽度。并且在任何地点或过滤器更改后,地点列表和文件列表的滚动条都会更新。- 对于级联的瞬态 shell(例如
XrwFileSelectionDialog
调用XrwMessageBox
),不保证最后调用的 shell 显示在最上面并被激活。现在,每次调用瞬态 shell 时都会调用XrwApplicationShell.RequestWindowActivation
。
在 中的改进
- 现在
XrwLabelBase
及其派生类支持TextOverflowBehaviour
的Clip
、Ellipsis
、AutolinebreakClip
和AutolinebreakEllipsis
。 - 现在,当
XrwRibbonTab
没有足够的宽度来显示所有XrwRibbonButton
和/或XrwRibbonSplitButton
在所有XrwRibbonPanel
中使用其PreferredSizeMode
时,可以通过更改XrwRibbonButton
和/或XrwRibbonSplitButton
的CurrentSizeMode
来调整其大小。有关详细信息,请参见XrwRibbonButton
和/或XrwRibbonSplitButton
描述。 - 现在,当
XrwRibbonButton
和XrwRibbonSplitButton
显示为CurrentSizeMode
==RibbonPanelSizePolicy.Large
时,如果标签文本适合狭窄宽度,可以显示为窄宽度(44px 而不是 64px)。 XrwFileSelectionDialog
、XrwBitmapAndVectorFontSelectionDialog
、XrwMessageBox
、XrwColorSelectionDialog
和XrwColorChoseDialog
现在支持使用 [Enter] 或 [Return] 键(等同于 OK 按钮)和 [Escape] 键(等同于 Cancel 按钮)关闭。XrwList
和XrwTree
现在支持非活动项/节点,这些项/节点无法被选中,并以InsensitiveTextColor
显示。- 添加了滑块
XrwScale
,它可以调整浮点值。 - 现在水平方向的
XrwScrollbar
,当拇指被拖动时,即使鼠标指针离开拇指向上或向下方向,拖动也会继续,但不会向右或向左。垂直方向的XrwScrollbar
,当拇指被拖动时,即使鼠标指针离开拇指向右或向左,拖动也会继续,但不会向上或向下。这种行为更接近 GTK 和 Windows 滚动条的行为。此外,这种行为与XrwList
和XrwTree
的列调整大小的行为以及XrwScale
的拖动行为一致。 - 引入了基本 XAML(请参阅Writing a XAML dialog application for X11、Writing a XAML ribbon application for X11 和 Writing a XAML application for X11 with massive data binding and zero code)。
在 中的改进
- 添加了
XrwFrame
,它只排列一个子项。 - 引入了
TStyleChar
数据类型和StyleText
类来支持文本样式。TStyleChar
支持单字体和XChar2b
文本输出(通过XDrawString16()
),以及字体集和TWchar
文本输出(通过XwcDrawString()
)。StyleText
类取代了Multiline
和Line
类。
==> 向XrwLabelBase
及其派生类(如XrwToggle
、XrwRadio
、XrwComboBox
、XrwTextSpinButton
和XrwLabelAndColor
)添加了与 GTK 的 Pango Markup Language 广泛可比的标记。 - 引入了键手势绑定,支持热键和快捷键,例如用于菜单。
- 更多基本 XAML(Writing a XAML calculator application for X11)。
- 引入了
TColor
数据类型以支持未来的 Alpha 混合。TColor
支持纯 **X11**TPixel
API 以及 **RGBA** 颜色。
==> 所有颜色属性已从TPixel
数据类型更改为TColor
数据类型。 - 键手势绑定到命令。
在 中的改进
- 添加了
XrwDockPanel
,它将子项排列到多达五个区域 - 顶部、底部、左侧或右侧的停靠面板,或填充剩余空间。 - 添加了
XrwUniformGrid
,它将子项排列到行和列中 - 根据子项的首选大小和网格的可用大小进行设置或动态计算。 - 添加了
XrwCanvas
,它管理XrwArcFigure
、XrwEllipseFigure
、XrwLineFigure
、XrwRectangleFigure
和XrwPathFigureCollection
等图形,以提供交互式和可操作的矢量图形。 - 添加了接口
X11IPicture
和类X11Image
,以及X11Graphic
。X11IPicture
抽象了X11Image
和X11Graphic
类,并且从现在开始被大多数 API 使用。而现有的X11Graphic
类提供了一个“静态”位图图像(在运行时不会改变)并易于访问预定义图标,新的X11Image
类通过封装XImage
结构提供了“易失性”位图图像(可以在运行时更改)。 - 除了
LeftBitmap
和RightBitmap
外,还支持XrwLabel
的两个新属性LeftBitmapInsensitive
和RightBitmapInsensitive
,以在敏感和非敏感状态下显示不同的图像集。 - 添加了一个非常简单的实现
XrwClientMessageBasedTimerManager
用于时间调度,它基于消息循环中重复的 X11 客户端消息。XrwApplicationShell
的消息循环负责调用和评估WM_CLIENT_SHIFT_TIMER
消息。 - 为所有小部件和大部分小配件添加了工具提示。延迟显示是通过
XrwClientMessageBasedTimerManager
实现的。
在 中的改进
- 向
XrwRectObj
添加了Margin
属性。边距是此小部件/小配件与其他相邻小部件/小配件之间的空间。 - 完成了
X11LinearGradientBrushInfo
类的实现(它也是 XAMLLinearGradientBrush
类的基础)。线性渐变到目前为止只绘制了中等颜色。它们现在受XrwFigure
和 XAMLShape
派生类的支持。 X11RadialGradientBrushInfo
类的实现(它也是 XAMLRadialGradientBrush
类的基础)。径向渐变到目前为止什么都没有绘制。它们现在受XrwFigure
和 XAMLShape
派生类的支持。- 几乎所有
XrwVisibleRectObj
派生的视图/小配件都将其背景绘制为模拟的线性(垂直)渐变,该渐变基于一组三种颜色,这些颜色可以通过*ColorDark
、*ColorLight
和*ColorMedium
属性访问(例如BackgroundColorDark
、BackgroundColorLight
和BackgroundColorMedium
)。所有这三组颜色属性,*ColorDark
、*ColorLight
和*ColorMedium
,已被单个*Brush
属性(例如BackgroundBrush
)替换。*Brush
属性接受X11LinearGradientBrushInfo
实例,这些实例提供完全向后兼容的外观和感觉,如果由包含原始*ColorDark
、*ColorLight
和*ColorMedium
值的三个颜色停止点提供支持。XrwVisibleRectObj
提供了许多预定义的X11LinearGradientBrushInfo
实例,以简化新*Brush
属性的使用,例如InteractiveBackgroundGradientBrush
、InteractiveFocusedBackgroundGradientBrush
、RibbonBackgroundGradientBrush
等。此更改是为了为新的背景绘图功能(具有不同方向或颜色数量的线性渐变画笔、径向渐变画笔、图像画笔等)做好 API 准备。 XrwRectObj.KeyPressChar
事件现在即使查找字符串为空也会发送。为了处理这些情况,XKeySym
将随事件一起传递。已添加XrwRectObj.KeyReleaseChar
事件。- XAML
Control
模板的基本实现。现在在MeasureCore()
期间评估Control.Template
属性。Button
类有一个默认模板(参见参考)。 - XAML
FrameworkElement
样式的基本实现。现在FrameworkElement.Stype
属性(Setter
、Trigger
和ControlTemplate
)生效。 XrwDockPanel
使用DockStyle.Left
作为默认停靠,并考虑LastChildFill
属性。XrwScrollbar
的自动重复(在持续按下左右或上下按钮时)触发了暴露事件,但在XrwScrollbar
位于对话框(XrwTransientShell
)中时,它们不起作用。由于自动重复实现限制了应用程序事件循环的处理速度,事件队列中经常出现一个窗口小部件的两个处置事件,并且应用程序事件循环的事件压缩推迟了暴露事件的处理。现在已修复,并且仅当事件队列中不包含该窗口小部件的暴露事件时,才会触发新的暴露事件。X11FontService
类PrepareFont()
方法的模糊逻辑,用于确定最佳匹配字体(如果没有字体 100% 匹配字体规范),现在有 6 个步骤而不是 3 个。- 弹出新
WmShell
的小部件(例如,XrwFileSelectionDialog
这样的对话框)在用户交互(例如,鼠标移动)改变焦点之前一直显示为焦点状态 - 即使小部件的父WmShell
(例如,XrwApplicationShell
)为了新WmShell
的利益而失去了焦点。现在通过在Redraw()
期间将小部件的MouseOver
和Focused
属性重置为false
来修复此问题,如果小部件的父WmShell
的HasFocus
属性为false
。为确保此重置,失去焦点的WmShell
会为其所有窗口和无窗口的子项调用额外的重绘。
临时结果 : Xrw 小部件/小配件接口的版本 1.00 非常可靠。所有已知错误都已修复。
但是:仍然缺少一些功能。特别是打印支持尚未实现,绘图能力已达到 X11 API 的极限。XAML/MVVM 方法在 GUI 创建方面效率更高,也更有趣。
这就是为什么我决定在接下来的几个版本中专注于 XrwXAML,并提供 Cairo 绘图以及 X11 绘图。Cairo 的替代方案将是 OpenGL/Mesa,但 Cairo 开箱即用地提供了 PDF(-> 打印)和 SVG 支持。
关注点
令人惊讶的是,创建具有吸引力设计的简单小部件集所需的工作量非常少。
这项工作也应该激励其他程序员在 Linux 或类 Linux 平台上的 Mono 上进行开发。
仍在努力完成与 Athena 小部件集兼容的小部件。
在实现了大部分与 Athena 小部件集兼容的小部件后,想法没有停止,而是超越了这一点,并创建了更复杂的小部件,例如 ribbon 和 property grid。
创建更复杂的小部件的想法继续与 paned 和 grid form 小部件一起发展。
为了释放 list 和 tree 小部件的强大功能,添加了列调整大小和重新排序以及就地编辑等功能。
实现国际化文本输出和自定义颜色选择。
实现基本 XAML 支持。
实现更高级一些的 XAML 支持。为
XrwLabelBase
及其派生类引入标记字符串。
进一步高级的 XAML 支持,侧重于控件和形状。这需要对 XAML 解释器代码进行一些深入的修改,并触发了一些 bug 修复和控件集扩展。
进一步高级的 XAML 支持,侧重于形状和控件模板。这触发了一些 bug 修复和控件集扩展。
历史
Roma Widget Set 的第一个公开版本是 版本,发布于 2014 年 1 月 20 日。
Roma Widget Set 的第二个公开版本是 版本,发布于 2014 年 3 月 7 日。
Roma Widget Set 的第三个公开版本是 版本,发布于 2014 年 4 月 1 日。
Roma Widget Set 的第四个公开版本是 版本,发布于 2014 年 5 月 13 日。
Roma Widget Set 的第五个公开版本是 版本,发布于 2014 年 8 月 15 日。
Roma Widget Set 的第六个公开版本是 版本,发布于 2014 年 10 月 5 日。
Roma Widget Set 的第七个公开版本是 版本,发布于 2014 年 12 月 6 日。
Roma Widget Set 的第八个公开版本是 版本,发布于 2015 年 3 月 8 日。
Roma Widget Set 的第九个公开版本是 版本,发布于 2015 年 10 月 9 日。
Roma Widget Set 的第十个公开版本是 版本,发布于 2017 年 3 月 27 日。