Monodevelop:从C#/Visual Studio移植:双击“消失”

Monodevelop:从C#/Visual Studio移植:双击“消失”,c#,visual-studio,monodevelop,double-click,C#,Visual Studio,Monodevelop,Double Click,在过去的两个月里,我在Visual Studio中用C#编写了应用程序。现在我必须通过Monodevelop将该应用程序移植到Linux。嗯,我已经解决了大多数移植错误,但有一个我无法解决。所有来自Visual Studio的双击和鼠标双击事件都停止了工作-我甚至创建了一个小的单表单应用程序,我只使用表单和一个事件(双击)移植到Mono-它也不工作-这意味着Monodevelop无法从Visual Studio移植双击事件?我已经检查了WND_Proc函数,Linux没有抛出任何相应的双击事件(

在过去的两个月里,我在Visual Studio中用C#编写了应用程序。现在我必须通过Monodevelop将该应用程序移植到Linux。嗯,我已经解决了大多数移植错误,但有一个我无法解决。所有来自Visual Studio的双击和鼠标双击事件都停止了工作-我甚至创建了一个小的单表单应用程序,我只使用表单和一个事件(双击)移植到Mono-它也不工作-这意味着Monodevelop无法从Visual Studio移植双击事件?我已经检查了WND_Proc函数,Linux没有抛出任何相应的双击事件(窗口中为515,标题栏上为300左右…)。我已经放弃了,准备写更多的代码来解决我代码中所有双击的问题,但也许有人有答案


我使用的是Ubuntu linux(如果必要的话,我可能会检查内核版本)、MONO:2.8.3、Visual Studio 2008和.NET 3.5中的project。

GTK#对待双击事件的方式不同于Windows窗体。您必须编写代码来翻译事件。如果你这样做,你不妨花时间反对双击作为习惯用法。

在实现鼠标单击时,Windows和Gtk之间有两个主要区别,你应该记住:

  • Gtk不提供“双击”信号(“Windows行话中的事件”),而只提供单个“点击”信号然而,Gdk库使用其EventButton类实现了双击和三次单击
  • Gtk区分了窗口小部件(或Windows行话中的“控件”)和“容器”(在Windows中没有直接的可比性)。放置在Gtk表单上的大多数小部件不会收到鼠标单击事件。为了接收鼠标事件,您需要将小部件放置在特定的容器(如EventBox)中
  • 下面是您的操作方法Gtk#:

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

    B.向此事件框中添加“通用小部件信号”中的信号“ButtonPressEvent”(在下面的示例中: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
    }
    
    收到的事件顺序(双击时)为:

  • Gdk.EventType.ButtonPress
  • Gdk.EventType.ButtonRelease
  • Gdk.EventType.ButtonPress
  • Gdk.EventType.TwoButton按
  • Gdk.EventType.ButtonRelease

  • 希望有帮助

    出于好奇,这个世界不是正在远离双击吗?好吧,我可以这么做。我已经注意到“失去焦点”功能无法正常工作(“聚焦”属性不会立即更改,我必须在10毫秒计时器后检查)。我只是希望Monodevelop能够在编译期间将这些事件转换/模拟为linux代码。