「Xamarin.Mac/NSViewでドラッグアンドドロップを受け付ける」を編集中

ナビゲーションに移動 検索に移動

警告: ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。ログインまたはアカウントを作成すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。

この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。

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

MonoBookへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細はMonoBook:著作権を参照)。 著作権保護されている作品は、許諾なしに投稿しないでください!

このページを編集するには、下記の確認用の質問に回答してください (詳細):

取り消し 編集の仕方 (新しいウィンドウで開きます)

このページで使用されているテンプレート:

このページは 1 個の隠しカテゴリに属しています: