MonoMac项目中的自定义选项卡

本文关键字:选项 自定义 项目 MonoMac | 更新日期: 2023-09-27 18:00:39

我正在使用MonoMac开发一个应用程序,到目前为止,我很高兴它在Windows世界中使用起来如此简单。然而,我被一个应该很容易实现的功能难住了:在选项卡标题中放置一个关闭按钮。

这里已经问过了:将关闭按钮添加到NSTabviewitem

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

有可能在MonoDevelop的MonoMac项目中使用这样的东西吗?我可以将xcode中的库添加为链接库,但MonoDevelop似乎无法保留这些更改。

由于(据我所知)MonoDevelop基本上生成了一个动态xCode项目,并在编辑后将其丢弃,我不确定这是否可能,希望有人能为我提供一些信息。

我不赞成铬标签的想法——对任何建议都持开放态度。

MonoMac项目中的自定义选项卡

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

你有几个选择:

1-用C#编写自己的实现

2-选择一个开源实现(例如Chromium Tabs)并将其移植到C#。这应该有效,但显然会很耗时。此外,你可能会发现你需要访问MonoMac中还没有的一些Cocoa API——你需要找到一个变通方法或实现它们。

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

我自己已经为第三名苦苦挣扎了一两天,但最终还是弄清楚了,所以我会和你分享这个过程,也许这会有所帮助。


我下载了chromium标签的源代码并编译了框架。您只需要将其编译为i386;由于MonoMac目前只提供32位运行时

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

在调用NSApplication之前,我在Main中手动加载框架。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。

您现在应该可以使用您的新绑定了!

我在库上做了一个非常小的绑定,只够让它启动并运行。你可以在这里下载。