Как я могу использовать DataObject в MacOS (перетаскивание файлов) - PullRequest
0 голосов
/ 09 июня 2018

DataObject является частью System.Windows и недоступен в Xamarin.Mac.Так как я могу сделать обходной путь.Я хочу создать функцию перетаскивания с внешним файлом.В Windows я могу сделать это с DataObject.

Я уже искал альтернативы, пробовал с NSUrl, но безуспешно.

1 Ответ

0 голосов
/ 09 июня 2018

Перетащите в ваше приложение:

Все классы на основе 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-адресов, обещание создатьсам файл позже и фактически вставляем данные файла в монтажный картон.

...