c# - Monodevelop:从 C#/Visual Studio 移植:双击消失

标签 c# visual-studio monodevelop double-click

在过去的 2 个月里,我在 Visual Studio 中用 C# 编写了应用程序。现在我必须通过 Monodevelop 将该应用程序移植到 Linux。好吧,我已经解决了大部分移植错误,但有一个我无法弄清楚。来自 Visual Studio 的所有双击和鼠标双击事件都停止工作了——我什至创建了一个小的 1-form 应用程序,我只用一个表单和一个事件(双击)移植到 Mono——它也没有工作——所以这意味着 Monodevelop 不能移植 double单击来自 Visual Studio 的事件?我已经检查了 WND_Proc 函数,Linux 不会抛出任何相应的双击事件(窗口中为 515,标题栏上为 300……)。我已经放弃并准备编写额外的代码来修复我代码中的所有双击问题,但也许有人有答案。

我使用的是 Ubuntu Linux(如果需要,我明天可能会检查内核版本)、MONO:2.8.3、Visual Studio 2008 和 .NET 3.5 中的项目。

最佳答案

在实现鼠标点击时,您应该牢记 Windows 和 Gtk# 之间的两个主要区别:

  1. Gtk# 不提供“双击”信号(Windows 术语中的“事件”),而只提供单次“单击”信号。 但是 Gdk 库确实通过其 EventButton 类实现了双击和三次点击!
  2. Gtk# 区分小部件(或 Windows 术语中的“控件”)和“容器”(Windows 中没有直接的可比项)。大多数放置在 Gtk# 窗体上的小部件将不会接收鼠标单击事件。为了接收鼠标事件,您需要将小部件放置在特定容器内 - 例如 EventBox。

这是你如何做的 Gtk#:

一个。将 EventBox 容器添加到您的表单(在下面的示例中:eventbox1)。您可以将它放在其他小部件后面,或者因为它不可见,除非您特别选择它(或更改其背景颜色)。您可以在 EventBox 中放置一个小部件,但仅限于一个小部件,它也将获取 EventBox 的形状和大小。

B.将来自“通用小部件信号”的信号“ButtonPressEvent”添加到此 EventBox(在下面的示例中:OnEventbox1ButtonPressEvent)

每次在 EventBox 中单击鼠标按钮(左、中或中心或其组合)时,都会触发此事件并调用函数 OnEventbox1ButtonPressEvent()。如果您需要在处理此事件时识别被单击的按钮,请使用以下 uint 值:args.Event.Button 通常“1”是鼠标左键,“2”是中心按钮,“3”是右键(“2”也可能是同时单击左右按钮时)。

顺便说一下,默认情况下不发送鼠标移动事件(没有按下按钮)。因此,如果您需要感知它们,您还需要在下面的代码示例的第一个部分添加 PointMotionMask。

下面是 ButtonPress 事件处理程序(EventBox 名称为“eventbox1”)使用 EventButton 类捕获双击事件的代码示例:

// The following line is may not be needed but is here to show how to do it
eventbox1.GdkWindow.Events = eventbox1.GdkWindow.Events | Gdk.EventMask.ButtonPressMask;

protected void OnEventbox1ButtonPressEvent (object o, ButtonPressEventArgs args)
{
    if( ((Gdk.EventButton)args.Event).Type == Gdk.EventType.TwoButtonPress)
        System.Media.SystemSounds.Beep.Play (); // Play a sound only if this is a double-click event
}

收到事件的顺序(在双击的情况下)是:

  1. Gdk.EventType.ButtonPress
  2. Gdk.EventType.ButtonRelease
  3. Gdk.EventType.ButtonPress
  4. Gdk.EventType.TwoButtonPress
  5. Gdk.EventType.ButtonRelease

希望对您有所帮助!

关于c# - Monodevelop:从 C#/Visual Studio 移植:双击消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12307969/

相关文章:

c# - 如何覆盖 NullReferenceException 行为以获得更好的信息量更大的错误?

c# - 使用 LINQ (C#) 实现分页?

c# - 无法让嵌套在 UpdatePanel 中的 WebControl 中的 ScriptManager.RegisterStartupScript 工作

visual-studio - Visual Studio 中的多行编辑

c# - VS Enterprise 负载测试发起 IP 地址

c# - 从 PDF 中仅提取粗体文本的最佳方法

visual-studio - Visual Studio postbuild - 更改为解决方案驱动器

iphone - UITextField 列表?如何实现类似的UI?

c# - Gstreamer 单声道开发人员

monodevelop - 在 MonoDevelop 3.0 中解析或重构 using 语句