Xamarin.MacのNSViewでMouseMovedイベントなどを発生させる
2017年12月21日 (木) 07:20時点におけるimported>Administratorによる版
NSViewには「MouseEntered」「MouseMoved」「MouseExited」というズバリなイベントがある。 しかしこれらのイベントは初期状態では発動しないようになっている。
public partial class MyView : AppKit.NSView
{
public override void MouseEntered(NSEvent theEvent)
{
base.MouseEntered(theEvent);
Console.WriteLine("MouseEntered");
}
public override void MouseMoved(NSEvent theEvent)
{
base.MouseMoved(theEvent);
Console.WriteLine("MouseMoved");
}
public override void MouseExited(NSEvent theEvent)
{
base.MouseExited(theEvent);
Console.WriteLine("MouseExited");
}
}
これらのイベントが発動するようにするにはNSViewのUpdateTrackingAreasメソッドをオーバーライドして、AddTrackingAreaメソッドで事前に「どの範囲で取るか」を明示的に指定をする。
NSTrackingArea _trackingArea;
public override void UpdateTrackingAreas()
{
if (_trackingArea != null)
{
this.RemoveTrackingArea(_trackingArea);
}
_trackingArea = new NSTrackingArea(
rect: this.Bounds,
options: NSTrackingAreaOptions.ActiveAlways |
NSTrackingAreaOptions.InVisibleRect |
NSTrackingAreaOptions.MouseEnteredAndExited |
NSTrackingAreaOptions.MouseMoved,
owner: this,
userInfo: null);
this.AddTrackingArea(_trackingArea);
base.UpdateTrackingAreas();
}
範囲指定やオーナー指定はみたままなので特に問題ないと思う。
オプション(NSTrackingAreaOptions)は以下のような列挙体になっており、大きくわけて「取得したいイベントの種類」と「取得する条件」の3種類を組み合わせて使用する。
- 取得したいイベントの種類
MouseEnteredAndExited | 1uL | EnteredとExitedイベントを発生させる |
MouseMoved | 2uL | Movedイベントを発生させる |
CursorUpdate | 4uL | カーソル変化も発生させる |
- 取得する条件1
ActiveWhenFirstResponder | 16uL | ビューにフォーカスのある時のみ取得する |
ActiveInKeyWindow | 32uL | ウインドウがアクティブな時のみ取得する |
ActiveInActiveApp | 64uL | アプリがアクティブな時のみ取得する(1アプリ複数ウインドウの場合は非アクティブでも取得) |
ActiveAlways | 128uL | 常に取得する |
- 取得する条件2
AssumeInside | 256uL | 内側にいる時すべて取得する |
InVisibleRect | 512uL | 見えている範囲内のみ取得する |
EnabledDuringMouseDrag | 1024uL | マウスのドラッグ中のみ取得する |