MonoMac项目中的自定义选项卡

时间:2013-02-23 21:51:14

标签: c# monomac

我正在使用MonoMac开发一个应用程序,到目前为止,我很高兴看到它来自Windows世界是多么容易使用。但是我很难实现一个简单的实现功能:在标签页面中放置一个关闭按钮。

这已经在这里被问到: Add a close button to NSTabviewitem

其中一个解决方案是在这里使用铬标签: https://github.com/rsms/chromium-tabs

是否可以在MonoDevelop的MonoMac项目中使用类似的东西?我可以将xcode中的库添加为链接库,但MonoDevelop似乎不会保留这些更改。

因为(根据我的理解)MonoDevelop基本上会生成一个动态xCode项目并在编辑后丢弃它我不确定它是否可行,并希望有人可以为我阐明它。

我没有与铬标签的想法结合 - 对任何建议持开放态度。

1 个答案:

答案 0 :(得分:0)

你是不对的,你不能简单地将框架添加到XCode项目中,因为它是由MonoDevelop生成的 - 从这个意义上说它不是一个“真正的”项目。

您有几个选择:

1 - 在C#中编写自己的实现

2 - 选择一个开源实现(例如Chromium Tabs)并将其移植到C#。这应该有效,但显然很耗时。您还可能发现需要访问MonoMac中尚不存在的一些Cocoa API - 您需要找出一种解决方法或实现它们。

3 - 可以将本机框架绑定到您的应用程序中。也许你可以找到一个已经为你感兴趣的框架做过这个的人;或者你可以自己做。

我现在已经和#3挣扎了一两天,但终于弄明白了所以我会和你分享这个过程,也许这会有所帮助。


我下载了chrome标签源并编译了框架。您只需将其编译为i386;因为MonoMac目前只提供32位运行时

我将ChromiumTabs.framework添加到我的项目中,并设置了一个预构建脚本,将其复制到$ {TargetDir} / $ {ProjectName} .app / Contents / Frameworks /

在调用NSApplication.Init()之前,我在Main中手动加载框架:

        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