2015-05-20 3 views
1

Прежде всего, моя цель - создать прагматически (без контроллеров или таких вещей, только один класс) без рамки NSWindow. В этом окне я хотел бы отслеживать события мыши, например: «Мышь вниз», движение мыши. Так просто.Как захватить события мыши в C# MonoMac

Мне нужно сделать это на C#, используя Xamarin Studio в проекте Monomac. Мое окно супер-простой

public class MyWindow : NSWindow 
{ 
    public MyWindow() 
     :base(new RectangleF (0, 0, 100, 100), 
      NSWindowStyle.Closable | NSWindowStyle.Resizable | NSWindowStyle.Titled, NSBackingStore.Buffered, 
      false) 
    { 
     this.StyleMask = NSWindowStyle.Borderless; 
     this.MakeKeyAndOrderFront(null); 
    } 
} 

Теперь, насколько я знаю, что я должен добавить NSView к этому NSWindow классу с заявленными событиями. Так что я создал NSView класс:

public class MouseTracking : NSView 
{ 
    public NSTrackingArea tracking; 

    public override bool AcceptsFirstResponder() 
    { 
     return true; 
    } 

    public override void DrawRect(RectangleF dirtyRect) 
    { 
     base.DrawRect(dirtyRect); 
     var context = NSGraphicsContext.CurrentContext.GraphicsPort; 
     var rectangle = new RectangleF (0,0, this.Frame.Width, this.Frame.Height); 
     NSColor.Blue.Set(); 
     context.FillRect (rectangle); 
    } 

    public override void UpdateTrackingAreas() 
    { 
     if (tracking != null) 
     { 
      this.RemoveTrackingArea(tracking); 
      tracking.Release(); 
     } 
     tracking = new NSTrackingArea(this.Frame,NSTrackingAreaOptions.MouseEnteredAndExited | NSTrackingAreaOptions.ActiveAlways ,this, null); 
     this.AddTrackingArea(tracking); 
    } 

    public override void MouseMoved(NSEvent theEvent) 
    { 
     Console.WriteLine("MouseMoved"); 
    } 

    public override void MouseExited(NSEvent theEvent) 
    { 
     Console.WriteLine("MouseExitedTest"); 
    } 
} 

Мой вопрос заключается в том, чтобы добавить MouseTracking NSView в MyWindow и сделать эти события мыши доступны? Я пытался в MyWindow конструктору сделать:

 MouseTracking tracking = new MouseTracking(); 
     this.ContentView.AddSubview (tracking); 

, но это не работает .. Я просто хочу, чтобы это сделать (две строки в WinForms):

this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseDown); 

private void panel1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { } 

Спасибо, за помощь

ответ

0

Вам не требуется DrawRect для захвата событий мыши. Вам нужно contructors:

public MouseTracking(NSCoder coder) 
     :base(coder) 
    { 
    } 

    public MouseTracking(RectangleF frameRect) 
     :base(frameRect) 
    { 
    } 

Вы можете также необходимо (возможно, вы не знаете, это еще), чтобы переопределить этот флаг:

public override bool AcceptsFirstMouse (NSEvent theEvent) 
    { 
     return true; 
    } 

и да, вы добавляете MouseTracking к MyWindow так же, как вы написали, так:

this.ContentView.AddSubview (tracking);