MonoMac/NSViewでファイルのドラッグアンドドロップを受け付ける

提供: MonoBook
移動: 案内検索

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で記述するより圧倒的に簡潔明瞭に記述できる。

関連項目[編集]

参考文献[編集]