Xamarin.Mac/NSViewでドラッグアンドドロップを受け付ける
< 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で記述するより圧倒的に簡潔明瞭に記述できる。