Frage

Ich habe eine DrawingArea die Ich mag würde Mausereignisse zu empfangen. Aus den Tutorials habe ich festgestellt, dass das keyPressEvent auch Mausereignisse fangen. Jedoch für den folgenden Code wird die Handler nie aufgerufen.

static void Main ()
{
    Application.Init ();
    Gtk.Window w = new Gtk.Window ("");

    DrawingArea a = new CairoGraphic ();
    a.KeyPressEvent += KeyPressHandler;
    w.Add(a);

    w.Resize (500, 500);
    w.DeleteEvent += close_window;
    w.ShowAll ();

    Application.Run ();
}

private static void KeyPressHandler(object sender, KeyPressEventArgs args)
{
    Console.WriteLine("key press event");   
}

Ich habe ein paar Dinge ausprobiert Lesen von verschiedenen Foren und Tutorials einschließlich:

ein EventBox zu den Fenstern Hinzufügen und die DrawingArea in der Event-Box setzen und für die EventBox zum keyPressEvent abonnieren möchte. (Funktionierte nicht)

Der Aufruf AddEvents ((int) Gdk.EventMask.AllEventsMask); auf irgendwelche und alle Widgets

Ich fand, dass in dem Windows-keyPressEvent abonniert habe mich Tastaturereignis aber nicht per Mausklick Ereignisse.

Alle relevanten Seiten in den Mono-docs geben Sie mir Fehler, damit ich ein bisschen bin stecken

War es hilfreich?

Lösung

Sie sollten auch daran denken, dass ein Ereignis Maske zu Ihren DrawingArea hinzugefügt werden soll:

a.AddEvents ((int) 
            (EventMask.ButtonPressMask    
            |EventMask.ButtonReleaseMask    
            |EventMask.KeyPressMask    
            |EventMask.PointerMotionMask));

So Ihr endgültiger Code so aussehen sollte:

class MainClass
{
    static void Main ()
    {
        Application.Init ();
        Gtk.Window w = new Gtk.Window ("");

        DrawingArea a = new DrawingArea ();
        a.AddEvents ((int) EventMask.ButtonPressMask);
        a.ButtonPressEvent += delegate(object o, ButtonPressEventArgs args) {
            Console.WriteLine("Button Pressed");
        };

        w.Add(a);

        w.Resize (500, 500);
        w.DeleteEvent += close_window;
        w.ShowAll ();

        Application.Run ();
    }

    static void close_window(object o, DeleteEventArgs args) {
        Application.Quit();
        return;
    }
}

Andere Tipps

Wenn Sie Mausereignisse fangen wollen, müssen Sie ButtonPressEvent, ButtonReleaseEvent und MotionNotifyEvent verwenden:

a.ButtonPressEvent += delegate(object o, ButtonPressEventArgs args) {
    Console.WriteLine("Button Pressed");
}

keyPressEvent ist nur für Keys.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top