2013-02-23 5 views
2

MonoMac을 사용하여 응용 프로그램을 개발하고 있으며 지금까지 Windows 환경에서 얼마나 쉽게 사용할 수 있는지에 대해 매우 기뻤습니다. 그러나 나는 구현하기 쉬운 기능 인 탭 헤더에 닫기 버튼을 두어야한다는 것을 알기 어렵다. MonoMac 프로젝트의 사용자 정의 탭

는 이미 여기에 질문을 받았다 : Add a close button to NSTabviewitem

그리고 솔루션 중 하나 여기에 크롬의 탭을 사용하는 것이 었습니다 : https://github.com/rsms/chromium-tabs

이 MonoDevelop와 MonoMac 프로젝트에 그런 일을 사용할 수 있습니까? 연결된 라이브러리로 xcode에 라이브러리를 추가 할 수는 있지만 MonoDevelop는 이러한 변경 사항을 유지하지 못하는 것 같습니다.

MonoDevelop는 기본적으로 동적 인 xCode 프로젝트를 생성하고 편집 한 후에 삭제합니다. 가능한지 확실하지 않습니다. 누군가가 나를 위해 그것을 밝힐 수 있기를 바라고 있습니다.

나는 크롬 탭이라는 아이디어에 결혼하지 않았습니다 - 어떤 제안이든 열릴 수 있습니다.

답변

0

프레임 워크를 XCode 프로젝트에 추가하는 것은 정확합니다. MonoDevelop에 의해 생성 되었기 때문에 프레임 워크를 추가 할 수는 없습니다. 그런 의미에서 '진짜'프로젝트는 아닙니다.

당신은 몇 가지 옵션이 있습니다

1 - C#을

2에서 자신의 구현을 작성 - C 번호에 오픈 소스 구현 (예를 들어, 크롬 탭)와 포트를 선택합니다. 이것은 효과가 있지만 분명히 시간이 많이 걸릴 것입니다. 또한 MonoMac에없는 일부 Cocoa API에 대한 액세스가 필요하다는 것을 알 수 있습니다. 해결책을 찾아내거나 구현해야합니다.

3 - 네이티브 프레임 워크를 앱에 바인딩 할 수 있습니다. 이미 관심이있는 프레임 워크에 대해 이미이 작업을 수행 한 사람을 찾을 수 있습니다. 또는 당신 스스로 할 수 있습니다.

저는 하루나 이틀 동안 # 3 혼자 힘들었지 만, 마침내 다 알아 냈습니다. 그래서 당신과 프로세스를 공유하고 도움이 될지도 모릅니다.


크롬 탭 소스를 다운로드하고 프레임 워크를 컴파일했습니다. i386으로 컴파일해야합니다. MonoMac은 현재 32 비트 런타임 만 제공하기 때문에

ChromiumTabs.framework를 프로젝트에 추가하고 $ {TargetDir}/$ {ProjectName} .app/Contents/Frameworks로 복사하기 위해 미리 빌드 스크립트를 설정했습니다./

내가 NSApplication.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 

다음, (당신은 소스에서 컴파일 MonoMac에서 사용 가능)와 그것을 먹이를 사용 parse.exe .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을 다운로드 할 수 있습니다.

관련 문제