Xamarin.MacのNSViewでMouseMovedイベントなどを発生させる

提供: MonoBook
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 マウスのドラッグ中のみ取得する

関連項目

参考文献