差分

ナビゲーションに移動 検索に移動

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

2,841 バイト追加, 2015年2月2日 (月) 10:04
ページの作成:「MonoMacにおいて、NSView(およびその派生クラス)でFinderからのファイルのドラッグ&ドロップを受け付けれる方法を模索中。...」
[[MonoMac]]において、NSView(およびその派生クラス)でFinderからのファイルのドラッグ&ドロップを受け付けれる方法を模索中。

==実装1==
Finderからのファイルのドラッグ&ドロップを受け付け入れるにはNSView(またはその派生クラス)を継承し、処理を追加してやる必要がある。
* DraggingEnteredで受け入れ可能かを返す
* PerformDragOperationで受け入れ時の処理をする

<source lang="csharp">
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;
}
}
</source>

===注意点===
この例に限った話ではないが、NSView(またはそのサブクラス)を継承した独自クラスを扱う際には以下の掟に従う必要がある。これによりXcode側(Interface Builder)上で独自クラスを認識するようになる。
*NSViewから派生する際にはクラスにRegister属性を付けること。
*IntPtr handleを引数とするコントラクタを用意すること。

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

==関連項目==
*[[MonoMac]]

==参考文献==
{{reflist}}

{{stub}}

[[category:MonoMac]]
匿名利用者

案内メニュー