2013-02-23 65 views
2

我正在使用MonoMac開發應用程序,至今一直很高興能夠輕鬆地使用來自Windows世界的應用程序。不過,我很遺憾應該實現一個簡單的功能:在標籤頁頭中放置一個關閉按鈕。MonoMac項目中的自定義選項卡

這是已經在這裏問: Add a close button to NSTabviewitem

及解決方法之一是在這裏使用鉻標籤: https://github.com/rsms/chromium-tabs

是否有可能使用類似的東西在MonoDevelop中一個項目的MonoMac?我可以將xcode中的庫作爲鏈接庫添加,但MonoDevelop似乎不支持這些更改。

由於(從我的理解)基本上的MonoDevelop生成一個動態的Xcode項目,將其丟棄編輯後,我不知道,如果有可能,我希望有人能提供一些線索就可以了我。

我沒有結婚鉻標籤的想法 - 打開任何建議。

回答

0

你是正確的,你不能簡單地將框架添加到XCode項目,因爲它是由MonoDevelop生成的 - 從這個意義上說它不是一個「真正的」項目。

你有兩個選擇:

1 - 寫在C#

2你自己的實現 - 選擇一個開源實現(如鉻標籤),並移植到C#。這應該工作,但顯然會很費時。此外,您可能會發現您需要訪問MonoMac中尚未提供的一些Cocoa API - 您需要找出解決方法或實施它們。

3 - 可以將本機框架綁定到您的應用程序中。也許你可以找到一個已經爲你感興趣的框架做過這件事的人;或者你可以自己做。

我一直在爲#3自己奮鬥了一兩天,但最後都想通了,所以我會與你分享這個過程,也許這會有所幫助。


我下載了鉻標籤源代碼並編譯了框架。你只需要將它編譯爲i386;因爲MonoMac目前只提供32位運行時間

我將ChromiumTabs.framework添加到我的項目中,並設置了一個預生成腳本以將其複製到$ {TargetDir}/$ {ProjectName} .app/Contents/Frameworks/

我手動加載框架內主,調用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