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

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

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