c# - MonoMac 项目中的自定义选项卡

标签 c# monomac

我正在使用 MonoMac 开发一个应用程序,到目前为止,我很高兴它在 Windows 世界中的易用性。然而,我对什么应该是一个容易实现的功能感到困惑:在选项卡标题中放置一个关闭按钮。

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

解决方案之一是在此处使用 Chrome 标签: https://github.com/rsms/chromium-tabs

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

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

我不赞同 chromium 标签的想法 - 愿意接受任何建议。

最佳答案

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

你有几个选择:

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

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

3 - 可以将 native 框架绑定(bind)到您的应用程序中。也许您可以找到已经为您感兴趣的框架完成此工作的人;或者你可以自己做。

我自己已经为 #3 苦苦挣扎了一两天,但终于弄明白了,所以我会与您分享这个过程,也许这会有所帮助。


我下载了 chromium 标签源并编译了框架。您只需要将其编译为 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 文件提供给它。使用生成的输出来创建将定义您的绑定(bind)的接口(interface)(关于绑定(bind)类型有很好的文档 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,您可以在项目中引用它。

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

我对库做了一个非常小的绑定(bind),足以启动和运行它。你可以下载here .

关于c# - MonoMac 项目中的自定义选项卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15046157/

相关文章:

c# - 如何在 C# 中解析 JSON 数组?

c# - DbQuery 与 IQueryable SQL 性能对比

c# - MVVM Light + Unity 还是 Prism?

c# - 在哪里注册 C# 事件?

c# - Nerd Dinner 模型是否使用最佳实践来处理对象?

c# - 使用 MonoMac 创建一个简单的 Hello World 应用程序

cocoa - NSWindow 关闭时 NWSWindow 事件顺序?

c# - 使用 MonoMac 以编程方式在窗口内的 WebView 中显示网页

c# - 在 NSOutlineView 中显示某些项目的上下文菜单

cocoa - 使 NSTableView 表现得像 WPF StackPanel