【问题标题】:Custom Tabs in MonoMac projectMonoMac 项目中的自定义选项卡
【发布时间】:2013-02-23 21:51:14
【问题描述】:

我正在使用 MonoMac 开发一个应用程序,到目前为止,我很高兴看到它来自 Windows 世界的易用性。但是,我很难理解应该是一个易于实现的功能:在选项卡标题中放置一个关闭按钮。

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

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

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

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

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

【问题讨论】:

    标签: c# monomac


    【解决方案1】:

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

    你有几个选择:

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

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

    3 - 可以将原生框架绑定到您的应用中。也许您可以找到已经为您感兴趣的框架完成此操作的人;或者你可以自己做。

    我自己已经为#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 文件提供给它。使用生成的输出来创建定义绑定的接口(有很好的关于绑定类型的文档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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-19
      • 2023-01-10
      • 2014-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多