可可 – 在MonoMac NSView中接收拖放?

可可 – 在MonoMac NSView中接收拖放?,第1张

概述这是我在这个问候网站上发表的第一篇文章. 我是一名经验丰富的C#,.Net和Mono用户,但MonoMac中的Noob, 我正在尝试编写一个在NSView上接收文件夹并使用其路径对文件夹内的文件执行 *** 作的应用程序… MonoMac框架没有实现draggingEntered:,draggingUpdated:,draggingExited:,prepareForDragOperation:,perf 这是我在这个问候网站上发表的第一篇文章.
我是一名经验丰富的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中接收拖放?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1002148.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存