「Xamarin.Mac/NSViewでドラッグアンドドロップを受け付ける」の版間の差分

ページの作成:「MonoMacにおいて、NSView(およびその派生クラス)でFinderからのファイルのドラッグ&ドロップを受け付けれる方法を模索中。...」
 
imported>Administrator
編集の要約なし
 
(同じ利用者による、間の1版が非表示)
1行目: 1行目:
[[MonoMac]]において、NSView(およびその派生クラス)でFinderからのファイルのドラッグ&ドロップを受け付けれる方法を模索中。
[[Xamarin.Mac]]において、NSView(およびその派生クラス)でFinderからのファイルのドラッグ&ドロップを受け付けれる方法を模索中。


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


=== 受付登録 ===
まず、RegisterForDraggedTypesメソッドでドロップを許可する種類を指定して受付を開始する。
これでドラッグを受け付けるようになる。
NSPasteboardには様々なタイプが用意されている。
<source lang="csharp">
<source lang="csharp">
    using System;
        void Initialize()
    using System.Drawing;
        {
    using System.Linq;
            this.RegisterForDraggedTypes(new string[]{
    using MonoMac.Foundation;
                NSPasteboard.NSFilenamesType
    using MonoMac.AppKit;
            });
    using MonoMac.ObjCRuntime;
        }
</source>


    [Register("DropFileTargetView")]
=== 受入処理 ===
     public class DropFileTargetView : NSView
以下の2つのドラッグ・アンド・ドロップ受入処理を実装する。
* DraggingEntered - 受け入れ可能かを返す
*: DraggingEnteredメソッドで許可されたものだけがPerformDragOperationメソッドに飛んでくる。
* PerformDragOperation - 受け入れ時の処理を実装する
*: このメソッドが未実装だとアプリごと落ちる。
 
=== 全体像 ===
<source lang="csharp">
using System;
using System.Collections.Generic;
using System.Linq;
using Foundation;
using AppKit;
 
namespace XamarinMacExamples
{
     public partial class SampleView : AppKit.NSView
     {
     {
         public DropFileTargetView()
        #region Constructors
            : base()
 
        // Called when created from unmanaged code
         public SampleView(IntPtr handle) : base(handle)
         {
         {
             Initialize();
             Initialize();
         }
         }


         public DropFileTargetView(IntPtr handle)
        // Called when created directly from a XIB file
            : base(handle)
        [Export("initWithCoder:")]
         public SampleView(NSCoder coder) : base(coder)
         {
         {
             Initialize();
             Initialize();
         }
         }
           
 
        // Shared initialization code
         void Initialize()
         void Initialize()
         {
         {
34行目: 57行目:
             // ※※※ これ重要 ※※※
             // ※※※ これ重要 ※※※
             //
             //
             RegisterForDraggedTypes(new string[]{"NSFilenamesPboardType"});
             // ドラッグ・アンド・ドロップの受付を開始する
         }
            // NSPasteboardには他にもいろいろなタイプがあるよ!
           
            this.RegisterForDraggedTypes(new string[]{
                NSPasteboard.NSFilenamesType
            });
         }              
 
         public override NSDragOperation DraggingEntered(NSDraggingInfo sender)
         public override NSDragOperation DraggingEntered(NSDraggingInfo sender)
         {
         {
            Console.WriteLine("DraggingEntered");
        Console.WriteLine("DraggingEntered");


            var pasteboard = sender.DraggingPasteboard;
        var pasteboard = sender.DraggingPasteboard;


            if (pasteboard.Types.Contains("NSFilenamesPboardType"))
        if (pasteboard.Types.Contains("NSFilenamesPboardType"))
            {
        {
                return NSDragOperation.Link;
        return NSDragOperation.Link;
            }
        }


            return NSDragOperation.None;
        return NSDragOperation.None;
         }
         }


         public override bool PerformDragOperation(NSDraggingInfo sender)
         public override bool PerformDragOperation(NSDraggingInfo sender)
         {
         {
            Console.WriteLine("PerformDragOperation");
        Console.WriteLine("PerformDragOperation");


            var pasteboard = sender.DraggingPasteboard;
        var pasteboard = sender.DraggingPasteboard;


            if (pasteboard.Types.Contains("NSFilenamesPboardType"))
        if (pasteboard.Types.Contains("NSFilenamesPboardType"))
            {
        {
                foreach (var item in pasteboard.PasteboardItems)
        foreach (var item in pasteboard.PasteboardItems)
                {
        {
                    Console.WriteLine(item.GetStringForType("public.file-url"));
        Console.WriteLine(item.GetStringForType("public.file-url"));
                }
        }
                return true;
        return true;
            }
        }


            return false;
        return false;
         }
         }
     }
     }
}
</source>
</source>


===注意点===
== 関連項目 ==
この例に限った話ではないが、NSView(またはそのサブクラス)を継承した独自クラスを扱う際には以下の掟に従う必要がある。これによりXcode側(Interface Builder)上で独自クラスを認識するようになる。
* [[Interface Builder/基本的な使い方‎]]
*NSViewから派生する際にはクラスにRegister属性を付けること。
* [[Xamarin.Mac/マウスの中ボタン(ホイール)のクリックを取得する]]
*IntPtr handleを引数とするコントラクタを用意すること。
* [[Xamarin.Mac/ウインドウ座標をビュー座標に変換する‎]]
 
===その他===
[[MonoMac]]では[[LINQ]]が使えるおかげで[[Objective-C]]で記述するより圧倒的に簡潔明瞭に記述できる。
 
==関連項目==
*[[MonoMac]]


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


{{stub}}
{{stub}}


[[category:MonoMac]]
[[category: MonoMac]]
[[category: Xamarin.Mac]]