我是一名经验丰富的C#,.Net和Mono用户,但MonoMac中的Noob,
我正在尝试编写一个在NSVIEw上接收文件夹并使用其路径对文件夹内的文件执行 *** 作的应用程序…
MonoMac框架没有实现draggingEntered:,draggingUpdated:,draggingExited:,prepareForDragOperation:,performDragOperation:,concludeDragOperation:和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,(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); } [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,(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,(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); } [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); } [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); }}
但这些方法不会被调用!
我也尝试了RegisterForDraggedTypes,但我不知道将什么传递给字符串数组作为类型!
请帮我搞清楚.我一直在谷歌搜索48!
解决方法 我终于通过做一些测试并将它们与Drag and Drop会话中的Apple文档进行比较,找到了我自己问题的答案.这是我使用的来源,它的世界就像一个魅力:
[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; } }}
这是一个小解释:
我首先想到使用Handle实例化Custom类,所以我需要在该方法中注册RegisterForDraggedTypes.
然后我使用Apple的文档示例跟踪RegisterForDraggedTypes字符串const并从中取出“RegisterForDraggedTypes”,将其用作文件路径的注册值.
使用Apple的文档示例表明需要导出的只有两种方法是draggingEntered:和performDragOperation:所以我只是导出它们并自己返回预期值而不是传递Cocoa来返回值,一切正常.
从NSPasteboardItems中提取文件URL所需的UTI是UTI Apple定义为“public.file-url”,因此我使用它来获取以下形式的路径:
file://localhost/PathTofileOrFolder/fileOrFoldername[/ if it is a
folder]
希望它可以帮助别人.
更新(2015-09-30):
我已将@M_K提到的更改应用于我的代码.
总结以上是内存溢出为你收集整理的可可 – 在MonoMac NSView中接收拖放?全部内容,希望文章能够帮你解决可可 – 在MonoMac NSView中接收拖放?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)