「Xamarin.Mac/NSViewでドラッグアンドドロップを受け付ける」を編集中
ナビゲーションに移動
検索に移動
この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 | 編集中の文章 | ||
1行目: | 1行目: | ||
− | [[ | + | [[MonoMac]]において、NSView(およびその派生クラス)でFinderからのファイルのドラッグ&ドロップを受け付けれる方法を模索中。 |
− | == 実装1 == | + | ==実装1== |
Finderからのファイルのドラッグ&ドロップを受け付け入れるにはNSView(またはその派生クラス)を継承し、処理を追加してやる必要がある。 | Finderからのファイルのドラッグ&ドロップを受け付け入れるにはNSView(またはその派生クラス)を継承し、処理を追加してやる必要がある。 | ||
+ | * DraggingEnteredで受け入れ可能かを返す | ||
+ | * PerformDragOperationで受け入れ時の処理をする | ||
− | |||
− | |||
− | |||
− | |||
<source lang="csharp"> | <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 | ||
{ | { | ||
− | + | public DropFileTargetView() | |
− | + | : base() | |
− | |||
− | public | ||
{ | { | ||
Initialize(); | Initialize(); | ||
} | } | ||
− | + | public DropFileTargetView(IntPtr handle) | |
− | + | : base(handle) | |
− | |||
{ | { | ||
Initialize(); | Initialize(); | ||
} | } | ||
− | + | ||
− | |||
void Initialize() | void Initialize() | ||
{ | { | ||
57行目: | 34行目: | ||
// ※※※ これ重要 ※※※ | // ※※※ これ重要 ※※※ | ||
// | // | ||
− | + | RegisterForDraggedTypes(new string[]{"NSFilenamesPboardType"}); | |
− | + | } | |
− | + | ||
− | |||
− | |||
− | } | ||
− | |||
public override NSDragOperation DraggingEntered(NSDraggingInfo sender) | 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) | 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> | </source> | ||
− | == | + | ===注意点=== |
− | * [[ | + | この例に限った話ではないが、NSView(またはそのサブクラス)を継承した独自クラスを扱う際には以下の掟に従う必要がある。これによりXcode側(Interface Builder)上で独自クラスを認識するようになる。 |
− | + | *NSViewから派生する際にはクラスにRegister属性を付けること。 | |
− | * [[ | + | *IntPtr handleを引数とするコントラクタを用意すること。 |
+ | |||
+ | ===その他=== | ||
+ | [[MonoMac]]では[[LINQ]]が使えるおかげで[[Objective-C]]で記述するより圧倒的に簡潔明瞭に記述できる。 | ||
+ | |||
+ | ==関連項目== | ||
+ | *[[MonoMac]] | ||
− | == 参考文献 == | + | ==参考文献== |
{{reflist}} | {{reflist}} | ||
{{stub}} | {{stub}} | ||
− | [[category: MonoMac | + | [[category:MonoMac]] |
− |