2013-02-23 1 views
2

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

Это уже было предложено здесь: Add a close button to NSTabviewitem

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

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

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

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

ответ

0

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

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

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

2 - Выберите реализацию с открытым исходным кодом (например, Chromium Tabs) и портирование на 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 файлов из фреймворка. Используйте сгенерированный вывод для создания интерфейсов, которые будут определять вашу привязку (есть хорошая документация по типам привязки here). Например:

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, которую вы можете ссылаться в своем проекте.

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

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