Xamarin.Mac/NSViewでドラッグアンドドロップを受け付ける

提供: MonoBook
< Xamarin.Mac
2017年6月13日 (火) 03:16時点におけるimported>Administratorによる版 (Administrator がページ「MonoMac/NSViewでファイルのドラッグアンドドロップを受け付ける」を「Xamarin.Mac/NSViewでドラッグアンドドロップを受け付ける」に移動しました)
ナビゲーションに移動 検索に移動

MonoMacにおいて、NSView(およびその派生クラス)でFinderからのファイルのドラッグ&ドロップを受け付けれる方法を模索中。

実装1

Finderからのファイルのドラッグ&ドロップを受け付け入れるにはNSView(またはその派生クラス)を継承し、処理を追加してやる必要がある。

  • DraggingEnteredで受け入れ可能かを返す
  • PerformDragOperationで受け入れ時の処理をする
    using System;
    using System.Drawing;
    using System.Linq;
    using MonoMac.Foundation;
    using MonoMac.AppKit;
    using MonoMac.ObjCRuntime;

    [Register("DropFileTargetView")] 
    public class DropFileTargetView : NSView
    {
        public DropFileTargetView()
            : base()
        {
            Initialize();
        }

        public DropFileTargetView(IntPtr handle)
            : base(handle)
        {
            Initialize();
        }
            
        void Initialize()
        {
            //
            // ※※※ これ重要 ※※※
            //
            RegisterForDraggedTypes(new string[]{"NSFilenamesPboardType"});
        }
            
        public override NSDragOperation DraggingEntered(NSDraggingInfo sender)
        {
            Console.WriteLine("DraggingEntered");

            var pasteboard = sender.DraggingPasteboard;

            if (pasteboard.Types.Contains("NSFilenamesPboardType"))
            {
                return NSDragOperation.Link;
            }

            return NSDragOperation.None;
        }

        public override bool PerformDragOperation(NSDraggingInfo sender)
        {
            Console.WriteLine("PerformDragOperation");

            var pasteboard = sender.DraggingPasteboard;

            if (pasteboard.Types.Contains("NSFilenamesPboardType"))
            {
                foreach (var item in pasteboard.PasteboardItems)
                {
                    Console.WriteLine(item.GetStringForType("public.file-url"));
                }
                return true;
            }

            return false;
        }
    }

注意点

この例に限った話ではないが、NSView(またはそのサブクラス)を継承した独自クラスを扱う際には以下の掟に従う必要がある。これによりXcode側(Interface Builder)上で独自クラスを認識するようになる。

  • NSViewから派生する際にはクラスにRegister属性を付けること。
  • IntPtr handleを引数とするコントラクタを用意すること。

その他

MonoMacではLINQが使えるおかげでObjective-Cで記述するより圧倒的に簡潔明瞭に記述できる。

関連項目

参考文献