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

提供: MonoBook
ナビゲーションに移動 検索に移動

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

実装1[編集 | ソースを編集]

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

受付登録[編集 | ソースを編集]

まず、RegisterForDraggedTypesメソッドでドロップを許可する種類を指定して受付を開始する。 これでドラッグを受け付けるようになる。 NSPasteboardには様々なタイプが用意されている。

        void Initialize()
        {
            this.RegisterForDraggedTypes(new string[]{
                NSPasteboard.NSFilenamesType 
            });
        }

受入処理[編集 | ソースを編集]

以下の2つのドラッグ・アンド・ドロップ受入処理を実装する。

  • DraggingEntered - 受け入れ可能かを返す
    DraggingEnteredメソッドで許可されたものだけがPerformDragOperationメソッドに飛んでくる。
  • PerformDragOperation - 受け入れ時の処理を実装する
    このメソッドが未実装だとアプリごと落ちる。

全体像[編集 | ソースを編集]

using System;
using System.Collections.Generic;
using System.Linq;
using Foundation;
using AppKit;

namespace XamarinMacExamples
{
    public partial class SampleView : AppKit.NSView
    {
        #region Constructors

        // Called when created from unmanaged code
        public SampleView(IntPtr handle) : base(handle)
        {
            Initialize();
        }

        // Called when created directly from a XIB file
        [Export("initWithCoder:")]
        public SampleView(NSCoder coder) : base(coder)
        {
            Initialize();
        }

        // Shared initialization code
        void Initialize()
        {
            //
            // ※※※ これ重要 ※※※
            //
            // ドラッグ・アンド・ドロップの受付を開始する
            // NSPasteboardには他にもいろいろなタイプがあるよ!
            this.RegisterForDraggedTypes(new string[]{
                NSPasteboard.NSFilenamesType 
            });
        }                

        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;
        }
    }
}

関連項目[編集 | ソースを編集]

参考文献[編集 | ソースを編集]