65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.86/5 (3投票s)

2020年3月24日

GPL3

3分钟阅读

viewsIcon

5960

downloadIcon

104

本文介绍了一种使用基本 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

你还可以通过两个函数初始化 HourMinute

void SetTime( int nHour, int nMinute )

void SetTime( double dTime )

以避免不得不从一个转换到另一个。

事件

它公开了 TimeChanged 事件,客户端可以使用该事件来了解 Time 何时发生更改。

关注点

Minute 控件也会前进 / 后退 Hour,即当 Minute 值增加超过 59 时,Hour 值会递增,或者如果它从 0 变为 59,则 Hour 值会递减。

默认的 OrientationVertical,因为我发现它比 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日:初始版本
© . All rights reserved.