メインメニューを開く

差分

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

672 バイト追加, 2017年6月13日 (火) 03:30
編集の要約なし
[[MonoMacXamarin.Mac]]において、NSView(およびその派生クラス)でFinderからのファイルのドラッグ&ドロップを受け付けれる方法を模索中。
==実装1==
Finderからのファイルのドラッグ&ドロップを受け付け入れるにはNSView(またはその派生クラス)を継承し、処理を追加してやる必要がある。
* DraggingEnteredで受け入れ可能かを返す
* PerformDragOperationで受け入れ時の処理をする
=== 受付登録 ===
まず、RegisterForDraggedTypesメソッドでドロップを許可する種類を指定して受付を開始する。
これでドラッグを受け付けるようになる。
NSPasteboardには様々なタイプが用意されている。
<source lang="csharp">
using System; void Initialize() { using System this.Drawing;RegisterForDraggedTypes(new string[]{ using System NSPasteboard.Linq;NSFilenamesType using MonoMac.Foundation }); using MonoMac.AppKit; } using MonoMac.ObjCRuntime;</source>
[Register(=== 受入処理 ===以下の2つのドラッグ・アンド・ドロップ受入処理を実装する。* DraggingEntered - 受け入れ可能かを返す*: DraggingEnteredメソッドで許可されたものだけがPerformDragOperationメソッドに飛んでくる。* PerformDragOperation - 受け入れ時の処理を実装する*: このメソッドが未実装だとアプリごと落ちる。 === 全体像 ===<source lang="DropFileTargetViewcsharp")] >using System;using System.Collections.Generic;using System.Linq;using Foundation;using AppKit; namespace XamarinMacExamples{ public partial class DropFileTargetView SampleView : AppKit.NSView
{
#region Constructors  // Called when created from unmanaged code public DropFileTargetViewSampleView(IntPtr handle) : base(handle)
{
Initialize();
}
// Called when created directly from a XIB file [Export("initWithCoder:")] public DropFileTargetViewSampleView(IntPtr handleNSCoder coder) : base(handlecoder)
{
Initialize();
}
// Shared initialization code
void Initialize()
{
// ※※※ これ重要 ※※※
//
// ドラッグ・アンド・ドロップの受付を開始する // NSPasteboardには他にもいろいろなタイプがあるよ! this.RegisterForDraggedTypes(new string[]{"NSFilenamesPboardType" 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;
}
}
}
</source>
===注意点=関連項目 ==この例に限った話ではないが、NSView(またはそのサブクラス)を継承した独自クラスを扱う際には以下の掟に従う必要がある。これによりXcode側(Interface Builder)上で独自クラスを認識するようになる。*NSViewから派生する際にはクラスにRegister属性を付けること。*IntPtr handleを引数とするコントラクタを用意すること。 ===その他===[[MonoMacInterface Builder/基本的な使い方‎]]では[[LINQ]]が使えるおかげで* [[Objective-CXamarin.Mac/マウスの中ボタン(ホイール)のクリックを取得する]]で記述するより圧倒的に簡潔明瞭に記述できる。 ==関連項目==*[[MonoMacXamarin.Mac/ウインドウ座標をビュー座標に変換する‎]]
==参考文献==
{{reflist}}
{{stub}}
[[category:MonoMac]][[category: Xamarin.Mac]]
匿名利用者