使用 MonoDevelop 和 Gtk3 在 Gtk# 中创建自定义 TimePicker 控件






3.86/5 (3投票s)
本文介绍了一种使用基本 GTK 部件组合的自定义 TimePicker 控件。
此控件是用 C# 编写的,并使用 GTK 版本 3。
背景
大约一年前,我终于切换到 Linux(使用 Cinnamon 桌面的 Linux Mint),对此我感到非常满意。多年来,我一直是 Windows 用户,在 Visual Studio 中编写 C# 程序,并充分利用 WPF 和 MVVM 模式。多年来,我开发了一些每天都在使用的 GUI 应用程序,将它们移植到 Linux 似乎是一项艰巨的任务,所以这让我长期“依赖”于 Windows 平台。
感谢 Mono 和 MonoDevelop 团队的英勇努力,移植这些程序比我最初想象的要容易得多。我一直使用多层方法 - 我的程序由数据层 DLL、业务逻辑 DLL 和包含 GUI 特定代码的可执行文件组成。移植这两个 DLL 非常简单,因为它们根本不需要修改,所以只剩下 GUI 代码需要重写。
我想说的是,我怀念 WPF 绑定和 WPF 工具包提供的组件。它们使编程变得容易。但作为一名程序员的好处是,你总能制作自己的工具。
本文的重点是其中一个“工具”,TimePicker
。我开发它是为了在我的程序中使用,并且,因为它有效,我希望它也能帮助你更轻松地生活。
目标
- 通过分享这个例子,鼓励其他程序员使用 Mono / MonoDevelop / Gtk# 组合。
- 使其像基本的 Gtk 部件一样易于使用。
- 在需要
Time
值的地方简化表单设计。
解决方案
TimePicker
控件派生自 HBox
,包含两个 SpinButton
和一个用于 “:
” 分隔符的 Label
。
它公开了以下内容
属性
- 获取 / 设置
Height
/Width
- 获取 / 设置
Orientation
- 获取 / 设置
Hour
- 获取 / 设置
Minute
- 将
Time
作为十进制值获取,例如,1 小时 30 分钟将返回 1.5 而不是 1.3
你还可以通过两个函数初始化 Hour
和 Minute
值
void SetTime( int nHour, int nMinute )
或
void SetTime( double dTime )
以避免不得不从一个转换到另一个。
事件
它公开了 TimeChanged
事件,客户端可以使用该事件来了解 Time
何时发生更改。
关注点
Minute
控件也会前进 / 后退 Hour
,即当 Minute
值增加超过 59
时,Hour
值会递增,或者如果它从 0
变为 59
,则 Hour
值会递减。
默认的 Orientation
是 Vertical
,因为我发现它比 Horizontal
更紧凑。
示例用法
初始化
TimePicker m_tpkr = new TimePicker() ;
等同于
TimePicker m_tpkr = new TimePicker() { Orientation = Orientation.Vertical };
但是
TimePicker m_tpkr = new TimePicker() { Orientation = Orientation.Horizontal };
效果一样好。
// 1. Set the Hour only : m_tpkr.Hour = 9;
// 2. Set the Minute only : m_tpkr.Minute = 15;
// 3. Set the Time via Hour & Minute : m_tpkr.SetTime( 9, 15 );
// 4. Set the Time via a double value : m_tpkr.SetTime( 9.25 ); // will show 09:15
连接事件处理程序
m_tpkr.TimeChanged += OnTimeChanged;
检索值
void OnTimeChanged( object sender, EventArgs e )
{
m_lblTime.Text = String.Format( "{0} -> {1} HH:mm", _
m_tpkr.Time.ToString( "N2" ), m_tpkr.StrTime );
// alternate ways to retrieve the Time as a String :
// m_lblTime.Text = m_tpkr.StrTime ;
// m_lblTime.Text = m_tpkr.ToString() ;
}
// double dTime = m_tpkr.Time ;
// int nHour = m_tpkr.Hour;
// int nMins = m_tpkr.Minute;
要求
- Mono (目前我有 6.6.0.166 版本)
- MonoDevelop (当前版本 7.8.4)
- Gtk3 库
提供的示例应用程序是一个 MonoDevelop 解决方案。它需要 Gtk 3 包。
由于这些是 DLL,它们不包含在示例项目中,但包含 packages.config 文件。在 MonoDevelop 中打开解决方案后,选择恢复 / 更新包,NuGet 将获取它们。
给读者的练习
这是作者们把他们自己避免做的所有困难的事情放进去的部分!:-)
- 添加工具箱 / 设计时支持
我在代码中构建我的 UI。 我没有使用 Glade 或任何其他 GUI 设计工具,所以我对它们以及在工具箱中提供一个控件需要什么并不熟悉。
- 与 DatePicker 结合以创建一个完整的 DateTimePicker 控件
历史
- 2020年3月24日:初始版本