Пользовательские вкладки в проекте MonoMac

Я использую MonoMac для разработки приложения и до сих пор был в восторге от того, насколько легко его использовать из мира Windows. Однако я в тупике на том, что должно быть легко реализовать: разместить кнопку закрытия в заголовке вкладки.

Об этом уже спрашивали здесь: Добавить кнопку закрытия в NSTabviewitem

И одним из решений было использовать вкладки хрома здесь: https://github.com/rsms/chromium-tabs

Можно ли использовать что-то подобное в проекте MonoMac с MonoDevelop? Я могу добавить библиотеку в xcode как связанную библиотеку, но MonoDevelop, похоже, не удерживает эти изменения.

Поскольку (насколько я понимаю) MonoDevelop в основном генерирует динамический проект xCode и отбрасывает его после редактирования, я не уверен, возможно ли это, и надеюсь, что кто-то может пролить на это свет для меня.

Я не женат на идее хромированных вкладок - открыт для любых предложений.


person Derek Kepler    schedule 23.02.2013    source источник


Ответы (1)


Вы правы в том, что вы не можете просто добавить фреймворк в проект XCode, потому что он сгенерирован MonoDevelop - в этом смысле это не «настоящий» проект.

У вас есть несколько вариантов:

1 - Напишите собственную реализацию на С#

2. Выберите реализацию с открытым исходным кодом (например, вкладки Chromium) и перенесите ее на C#. Это должно сработать, но, очевидно, займет много времени. Также вы можете обнаружить, что вам нужен доступ к некоторым API-интерфейсам Cocoa, которых еще нет в MonoMac — вам нужно будет найти обходной путь или реализовать их.

3. Можно привязать собственный фреймворк к вашему приложению. Возможно, вы сможете найти кого-то, кто уже сделал это для интересующей вас структуры; или вы можете сделать это сами.

Я сам боролся с # 3 уже день или два, но, наконец, все понял, поэтому я поделюсь с вами процессом, и, возможно, это будет полезно.


Я скачал исходный код вкладок хрома и скомпилировал фреймворк. Вам нужно будет скомпилировать его только как i386; поскольку MonoMac в настоящее время поставляет только 32-битную среду выполнения

Я добавил ChromiumTabs.framework в свой проект и настроил сценарий предварительной сборки, чтобы скопировать его в ${TargetDir}/${ProjectName}.app/Contents/Frameworks/

Я загружаю фреймворк вручную внутри Main перед вызовом NSApplication.Init():

        var baseAppPath = Directory.GetParent(Directory.GetParent(System.AppDomain.CurrentDomain.BaseDirectory).ToString());
        var chromiumPath = baseAppPath + "/Frameworks/ChromiumTabs.framework/ChromiumTabs";
        var hresult = Dlfcn.dlopen(chromiumPath, 0); // Non-zero result indicates success

Затем используйте parse.exe (доступен в MonoMac при компиляции из исходного кода) и передайте ему файлы .h из фреймворка. Используйте сгенерированный вывод для создания интерфейсов, которые будут определять вашу привязку (есть хорошая документация по типам привязки здесь). Например:

using System;
using System.Drawing;
using MonoMac.Foundation;
using MonoMac.AppKit;

namespace ChromiumTabs
{
    [BaseType (typeof (NSWindowController))]
    interface CTTabWindowController {
    }

[BaseType (typeof (CTTabWindowController))]
interface CTBrowserWindowController {
    [Export ("browser")]
    CTBrowser Browser { get;  }

    [Export ("initWithBrowser:")]
    IntPtr Constructor (CTBrowser browser);
}

[BaseType (typeof (NSObject))]
interface CTBrowser {
    [Export ("addBlankTabInForeground:")]
    CTTabContents AddBlankTabInForeground (bool foreground);

    [Export ("createBlankTabBasedOn:")]
    CTTabContents CreateBlankTabBasedOn (CTTabContents baseContents);
}

[BaseType (typeof (NSDocument))]
interface CTTabContents {
    [Export ("initWithBaseTabContents:")]
    IntPtr Constructor ([NullAllowed]CTTabContents baseContents);

    [Export ("viewFrameDidChange:")]
    void ViewFrameDidChange (RectangleF newFrame);
}
}

Теперь передайте этот файл .cs в bmac.exe (см. справку для аргументов, которые вам нужно предоставить). Это выведет управляемую DLL, на которую вы можете ссылаться в своем проекте.

Теперь вы сможете использовать новую привязку!

Я сделал очень минимальную привязку к библиотеке, достаточно, чтобы она заработала. Вы можете скачать это здесь.

person TheNextman    schedule 26.02.2013