Xamarin.Mac/NSViewでドラッグアンドドロップを受け付ける
ナビゲーションに移動
検索に移動
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;
}
}
}