Перетащите в ваше приложение:
Все классы на основе NSView имеют метод RegisterForDraggedTypes
, который вы передаете, что хотите принять (в вашем случае UTType.FileURL
, когда вы передаете что-то в приложение,предположительно файл из Finder).
Так что в этом случае у меня есть NSTableView
, который принимает файлы, добавляет их в таблицу и запускает уведомление, которое заставляет NSTask
их обрабатывать (это FFMPEGзадачи).
tableView.RegisterForDraggedTypes(new string[] { UTType.FileURL };
Оттуда это зависит от типа NSView, в который вы перетаскиваете, но, например, с NSTableView
вы назначаете его делегату данных подкласс NSTableViewDataSource
, который у вас естьпереопределены ValidateDrop
и AcceptDrop
.
В NSTableViewDataSource.ValidateDrop
вы подтверждаете, содержит ли дроп файл (ы), которые вы примете.В этом случае, если это файл любого типа, который я принимаю:
public override NSDragOperation ValidateDrop(NSTableView tableView, NSDraggingInfo info, nint row, NSTableViewDropOperation dropOperation)
{
var operation = NSDragOperation.Copy;
using (var pasteBoard = info.DraggingPasteboard)
{
foreach (var item in pasteBoard.PasteboardItems)
{
if (!item.Types.Contains(UTType.FileURL))
{
operation = NSDragOperation.None;
}
item.Dispose();
}
}
return operation;
}
In в NSTableViewDataSource.AcceptDrop
, вы фактически обрабатываете файлы из папки.
public override bool AcceptDrop(NSTableView tableView, NSDraggingInfo info, nint row, NSTableViewDropOperation dropOperation)
{
using (var pasteBoard = info.DraggingPasteboard)
{
if (pasteBoard.PasteboardItems.Length > 0)
{
var range = new NSRange(-1, 0);
foreach (var item in pasteBoard.PasteboardItems)
{
if (item.Types.Contains(UTType.FileURL))
{
var finderNode = item.GetStringForType(UTType.FileURL);
// you have a file from macOS' finder, do something with it, assumable in a table view you would add a record/row....
var url = NSUrl.FromString(finderNode);
// url has the file extension, filename, full path, etc...
Post a notification / Add a task to GCD / etc...
}
item.Dispose();
}
return true;
}
}
return false;
}
Перетащите из своего приложения:
Предположим, у вас есть подкласс NSView
, из которого вы хотите перетащить «файл» из Finder или любого приложения, которое принимает удаление файлов.Реализовать интерфейсы;INSDraggingSource
и INSPasteboardItemDataProvider
в вашем подклассе NSView
.
В событии MouseDown
начните перетаскивание для UTType.FileURL
типов:
public override void MouseDown(NSEvent theEvent)
{
var pasteboardItem = new NSPasteboardItem();
pasteboardItem.SetDataProviderForTypes(this, new string[1] { UTType.FileURL });
var draggingItem = new NSDraggingItem(pasteboardItem);
var fileDragIcon = new NSImage("theDraggingIcon.png");
draggingItem.SetDraggingFrame(new CoreGraphics.CGRect(0,0,40,40), fileDragIcon);
BeginDraggingSession(new NSDraggingItem[1] { draggingItem }, theEvent, this);
}
В ProvideDataForType
поместите URL-адрес файла на монтажную панель:
public void ProvideDataForType(NSPasteboard pasteboard, NSPasteboardItem item, string type)
{
if (type == UTType.FileURL )
{
var url = new NSUrl("/Users/Sushi/Desktop/StackOverflow.png", false);
url.WriteToPasteboard(pasteboard);
}
}
Примечание: это только один из способов передачи файла, есть три других способа перетаскивания файлов, вы также можете предоставить массив URL-адресов, обещание создатьсам файл позже и фактически вставляем данные файла в монтажный картон.