我正在使用MonoMac开发一个应用程序,到目前为止,我很高兴看到它来自Windows世界是多么容易使用。但是我很难实现一个简单的实现功能:在标签页面中放置一个关闭按钮。
这已经在这里被问到: Add a close button to NSTabviewitem
其中一个解决方案是在这里使用铬标签: https://github.com/rsms/chromium-tabs
是否可以在MonoDevelop的MonoMac项目中使用类似的东西?我可以将xcode中的库添加为链接库,但MonoDevelop似乎不会保留这些更改。
因为(根据我的理解)MonoDevelop基本上会生成一个动态xCode项目并在编辑后丢弃它我不确定它是否可行,并希望有人可以为我阐明它。
我没有与铬标签的想法结合 - 对任何建议持开放态度。
答案 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。