2

私は MonoMac を使用してアプリケーションを開発していますが、今のところ、Windows の世界に由来する使いやすさに満足しています。しかし、実装するのが簡単な機能であるはずの機能、つまりタブヘッダーに閉じるボタンを配置することに困惑しています。

これはすでにここで質問されています: Add a close button to NSTabviewitem

解決策の 1 つは、ここでクロム タブを使用することでした: https://github.com/rsms/chromium-tabs

MonoDevelop を使用して MonoMac プロジェクトでそのようなものを使用することは可能ですか? リンクされたライブラリとしてxcodeにライブラリを追加できますが、MonoDevelopはそれらの変更を保持していないようです。

(私の理解から)MonoDevelopは基本的に動的xCodeプロジェクトを生成し、編集後にそれを破棄するので、それが可能かどうかはわかりません。

私はクロムタブのアイデアと結婚していません-どんな提案も受け入れます.

4

1 に答える 1

0

フレームワークは MonoDevelop によって生成されるため、XCode プロジェクトに単純に追加することはできません。その意味で「実際の」プロジェクトではありません。

いくつかのオプションがあります。

1 - C# で独自の実装を作成する

2 - オープン ソースの実装 (Chromium タブなど) を選択し、C# に移植します。これは機能するはずですが、明らかに時間がかかります。また、MonoMac にはまだ存在しない一部の Cocoa API にアクセスする必要があることに気付くかもしれません。回避策を見つけるか、それらを実装する必要があります。

3 - ネイティブ フレームワークをアプリにバインドできます。おそらく、あなたが興味を持っているフレームワークのためにこれをすでに行っている人を見つけることができます。または自分で行うこともできます。

私は 1 日か 2 日、自分で #3 に苦労していましたが、最終的にすべてを理解したので、そのプロセスをあなたと共有します。これが役立つかもしれません。


クロム タブ ソースをダウンロードし、フレームワークをコンパイルしました。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 ファイルをフィードします。生成された出力を使用して、バインディングを定義するインターフェイスを作成します (バインディング タイプに関する適切なドキュメントがここにあります)。例えば:

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 が出力されます。

これで、新しいバインディングを使用できるようになります!

ライブラリを起動して実行するのに十分な、最小限のバインドをライブラリに行いました。こちらからダウンロードできます。

于 2013-02-26T20:08:41.920 に答える