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

提供:MonoBook
imported>Administrator
imported>Administrator
編集の要約なし
 
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]]

2017年6月13日 (火) 03:30時点における最新版

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;
        }
    }
}

関連項目[編集 | ソースを編集]

参考文献[編集 | ソースを編集]