2012-03-12 9 views
4

これは私の最初の投稿です。この挨拶のウェブサイトです。 私は経験豊富なC#、.NetとMonoのユーザーですが、MonoMacのNoob NSViewにフォルダを受け取り、そのパスを使ってフォルダ内のファイルを処理するアプリケーションを作成しようとしています...MonoMac NSViewでドラッグドロップを受信して​​いますか?

MonoMacフレームワークはdraggingEntered:, draggingUpdated:, draggingExited:, prepareForDragOperation:, performDragOperation:, concludeDragOperation: and draggingEnded:

を実装していませんでしたので、私は彼らに自分自身を実装しようとした:

[Register("TargetView")] 
public class TargetView:NSView 
{ 
    private static IntPtr selDraggingEntered = Selector.GetHandle ("draggingEntered:"); 

    private static IntPtr selDraggingUpdated = Selector.GetHandle ("draggingUpdated:"); 

    private static IntPtr selDraggingExited = Selector.GetHandle ("draggingExited:"); 

    private static IntPtr selPrepareForDragOperation = Selector.GetHandle ("prepareForDragOperation:"); 

    private static IntPtr selPerformDragOperation = Selector.GetHandle ("performDragOperation:"); 

    private static IntPtr selConcludeDragOperation = Selector.GetHandle ("concludeDragOperation:"); 

    private static IntPtr selDraggingEnded = Selector.GetHandle ("draggingEnded:"); 

    public TargetView():base(){ 
    } 

    public TargetView(NSCoder coder):base(coder){ 
    } 

    public TargetView(NSObjectFlag t):base(t){ 
    } 

    public TargetView(IntPtr handle):base(handle){ 
    } 

    public TargetView(RectangleF frameRect):base(frameRect){ 
    } 

    [Export ("draggingEntered:")] 
    public virtual NSDragOperation DraggingEntered (NSDraggingInfo sender) 
    { 
     if (sender == null) 
     { 
      throw new ArgumentNullException ("sender"); 
     } 
     if (this.IsDirectBinding) 
     { 
      return (NSDragOperation)Messaging.int_objc_msgSend_int (base.Handle, TargetView.selDraggingEntered, (int)sender.DraggingSourceOperationMask); 
     } 
     return (NSDragOperation)Messaging.int_objc_msgSendSuper_int (base.Handle, TargetView.selDraggingEntered, (int)sender.DraggingSourceOperationMask); 
    } 

    [Export ("draggingUpdated:")] 
    public virtual NSDragOperation DraggingUpdated (NSDraggingInfo sender) 
    { 
     if (sender == null) 
     { 
      throw new ArgumentNullException ("sender"); 
     } 
     if (this.IsDirectBinding) 
     { 
      return (NSDragOperation)Messaging.int_objc_msgSend_int (base.Handle, TargetView.selDraggingUpdated, (int)sender.DraggingSourceOperationMask); 
     } 
     return (NSDragOperation)Messaging.int_objc_msgSendSuper_int (base.Handle, TargetView.selDraggingUpdated, (int)sender.DraggingSourceOperationMask); 
    } 

    [Export ("draggingExited:")] 
    public virtual void DraggingExited (NSDraggingInfo sender) 
    { 
     if (sender == null) 
     { 
      throw new ArgumentNullException ("sender"); 
     } 
     if (this.IsDirectBinding) 
     { 
      Messaging.void_objc_msgSend_int (base.Handle, TargetView.selDraggingExited, (int)sender.DraggingSourceOperationMask); 
     } 
     Messaging.void_objc_msgSendSuper_int (base.Handle, TargetView.selDraggingExited, (int)sender.DraggingSourceOperationMask); 
    } 

    [Export ("prepareForDragOperation:")] 
    public virtual bool PrepareForDragOperation (NSDraggingInfo sender) 
    { 
     if (sender == null) 
     { 
      throw new ArgumentNullException ("sender"); 
     } 
     if (this.IsDirectBinding) 
     { 
      return Messaging.bool_objc_msgSend_int (base.Handle, TargetView.selPrepareForDragOperation, (int)sender.DraggingSourceOperationMask); 
     } 
     return Messaging.bool_objc_msgSendSuper_int (base.Handle, TargetView.selPrepareForDragOperation, (int)sender.DraggingSourceOperationMask); 
    } 

    [Export ("performDragOperation:")] 
    public virtual bool PerformDragOperation (NSDraggingInfo sender) 
    { 
     if (sender == null) 
     { 
      throw new ArgumentNullException ("sender"); 
     } 
     if (this.IsDirectBinding) 
     { 
      return Messaging.bool_objc_msgSend_int (base.Handle, TargetView.selPerformDragOperation, (int)sender.DraggingSourceOperationMask); 
     } 
     return Messaging.bool_objc_msgSendSuper_int (base.Handle, TargetView.selPerformDragOperation, (int)sender.DraggingSourceOperationMask); 
    } 

    [Export ("concludeDragOperation:")] 
    public virtual void ConcludeDragOperation (NSDraggingInfo sender) 
    { 
     if (sender == null) 
     { 
      throw new ArgumentNullException ("sender"); 
     } 
     if (this.IsDirectBinding) 
     { 
      Messaging.void_objc_msgSend_int (base.Handle, TargetView.selConcludeDragOperation, (int)sender.DraggingSourceOperationMask); 
     } 
     Messaging.void_objc_msgSendSuper_int (base.Handle, TargetView.selConcludeDragOperation, (int)sender.DraggingSourceOperationMask); 
    } 

    [Export ("draggingEnded:")] 
    public virtual void DraggingEnded (NSDraggingInfo sender) 
    { 
     if (sender == null) 
     { 
      throw new ArgumentNullException ("sender"); 
     } 
     if (this.IsDirectBinding) 
     { 
      Messaging.void_objc_msgSend_int (base.Handle, TargetView.selDraggingEnded, (int)sender.DraggingSourceOperationMask); 
     } 
     Messaging.void_objc_msgSendSuper_int (base.Handle, TargetView.selDraggingEnded, (int)sender.DraggingSourceOperationMask); 
    } 
} 

をしかし、方法は呼び出されません!

私もRegisterForDraggedTypesにしようとしましたが、タイプとして文字列配列に何を渡すべきかわかりません!

私がそれを理解するのを助けてください。私は今48のGoogleを検索している!

答えて

7

最終的にいくつかのテストを行い、ドラッグアンドドロップセッションに関するアップルのドキュメントと比較することで、自分自身の答えを自分で見つけました。ここで

は、私は魔法のように世界を使用してソースである:ここでは

[Register("DropTargetView")] 
public class DropTargetView:NSView 
{ 
    public DropTargetView(IntPtr handle):base(handle){ 

     RegisterForDraggedTypes(new string[]{"NSFilenamesPboardType"}); 
    } 

    [Export ("draggingEntered:")] 
    public NSDragOperation DraggingEntered (NSDraggingInfo sender) 
    { 
     NSPasteboard pasteboard = sender.DraggingPasteboard; 

     bool typeExists = (Array.IndexOf(pasteboard.Types,"NSFilenamesPboardType") >= 0); 

     if(typeExists) 
     { 
      return NSDragOperation.Link; 
     } 
     else 
     { 
      return NSDragOperation.None; 
     } 
    } 

    [Export ("performDragOperation:")] 
    public bool PerformDragOperation (NSDraggingInfo sender) 
    { 
     NSPasteboard pasteboard = sender.DraggingPasteboard; 

     bool typeExists = (Array.IndexOf(pasteboard.Types,"NSFilenamesPboardType") >= 0); 

     if(typeExists) 
     { 
      NSPasteboardItem[] pasteboardItems = pasteboard.PasteboardItems; 

      for(int i = 0; i < pasteboardItems.Length; i++) 
      { 
       string urlStr = pasteboardItems[i].GetStringForType("public.file-url"); 

       NSUrl url = new NSUrl (urlStr); 

       string filePath = url.Path; 

       Console.WriteLine(filePath); 
      } 

      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
} 

は少し説明です:

私が最初に私が必要なので、カスタムクラスは、ハンドルを使用してインスタンス化されていることを考え出しましたそのメソッドにRegisterForDraggedTypesを登録します。 次に、Appleのドキュメントのサンプルを使用して、RegisterForDraggedTypes文字列constをトレースし、ファイルのパスの登録値として使用するために "RegisterForDraggedTypes"を取り出しました。 Appleのドキュメントのサンプルを使用して、エクスポートする必要がある2つのメソッドがdraggingEntered:とperformDragOperation:であることが分かりましたので、私はそれらをエクスポートして、値を返すためにCocoaの代わりに期待値を返しました。今。 UTIはNSPasteboardItemsから抽出されるファイルのURLのために必要なUTI Appleが「public.file-URL」として定義され、私はの形でパスを取得するためにそれを使用している:

ファイル://localhostの/ PathToFileOrFolder/FileOrFolderName [/それは フォルダの場合]

は、それが他の誰かに役立ちます願っています。

アップデート(2015年9月30日):

私は自分のコードに@M_Kで述べた変更を適用しています。

0

私はMonoMac/Xamarin、代わりにファイルパスのpasteboardItems[i].GetStringForType("public.file-url")への呼び出しの最新バージョンで、それはURLを返すことに気づい:

ファイル:///ファイル/ ID = ...

string urlStr = pasteboardItems[i].GetStringForType("public.file-url"); 
NSUrl url = new NSUrl (urlStr); 
string filePath = url.Path; 

は、あなたがこれを行うために必要なファイルのパスを取得するには
関連する問題