使用monomac / c#实例化一个额外的窗口

时间:2013-01-17 22:24:30

标签: c# objective-c xcode mono monomac

我一直在寻找这个问题的答案,虽然我意识到这可能非常微不足道,但不知怎的,我得到了答案。

我需要显示第二个窗口(通过单击菜单项启动,如果这很重要)。我非常清楚如何用winforms做到这一点,但我不确定monomac / NSWindow的等价物是什么。我需要这样做:

MyWindowClass myWindow = new MyWindowClass();
myWindow.Show();

我可以在这个主题上找到的最佳信息表明以下内容应该有效:

MyWindowClass myWindow = new MyWindowClass();
myWindow.MakeKeyAndOrderFront(this);

但是当我尝试这个时,它告诉我MyWindowClass()需要一个重载,所以我看一下构造函数并看到它要求一个IntPtr。不知道更好,我试试这个:

MyWindowClass myWindow = new MyWindowClass(new IntPtr());
myWindow.MakeKeyAndOrderFront(this);

此代码将无错运行,但在尝试启动窗口时没有任何反应。

我确定我只是犯了一个愚蠢的错误,但我一直无法找到关于这个主题的任何内容。任何帮助将不胜感激。

编辑:作为参考,这是构造函数的相关部分:

public MyWindowClass (IntPtr handle) : base (handle)
    {
        Initialize ();
    }

其他信息:我正在尝试使用以下方法在AppDelegate.cs中运行上面的代码:

partial void showWindow (MonoMac.Foundation.NSObject sender){
        MyWindowClass myWindow = new MyWindowClass(new IntPtr());
        myWindow.MakeKeyAndOrderFront(this);
    }

更多代码:

public partial class ViewPaths : MonoMac.AppKit.NSWindow
{
    #region Constructors
    public ViewPaths ()
    {
        Initialize();
    }

    // Called when created from unmanaged code
    public ViewPaths (IntPtr handle) : base (handle)
    {
        Initialize ();
    }

    // Called when created directly from a XIB file
    [Export ("initWithCoder:")]
    public ViewPaths (NSCoder coder) : base (coder)
    {
        Initialize ();
    }

    // Shared initialization code
    void Initialize ()
    {
    }

    #endregion
}

然后是实际的实例化:

public partial class AppDelegate : NSApplicationDelegate
{
    MainWindowController mainWindowController;
    ViewPaths display;
    public AppDelegate ()
    {
    }

    public override void FinishedLaunching (NSObject notification)
    {
        mainWindowController = new MainWindowController ();
        mainWindowController.Window.MakeKeyAndOrderFront (this);
    }


    partial void viewPaths (MonoMac.Foundation.NSObject sender){
        display = new ViewPaths();
        display.MakeKeyAndOrderFront(this);
    }

}

}

这显示了一个没有任何UI元素的窗口。

2 个答案:

答案 0 :(得分:2)

只需添加一个没有handle参数的默认构造函数。确保MyWindowClass子类化NSWindow,它应该可以工作。

此外,您可能需要保持对myWindow的引用 - 这样就不会收集垃圾。

答案 1 :(得分:2)

为清楚起见,这是解决问题的最终代码,如果其他任何人都在谷歌这个:

由于我用控制器创建了一个新的monomac窗口,我需要创建该控制器的一个实例,并显示控制器的窗口:

MyWindowController myWindow = new MyWindowController();
myWindow.Window.MakeKeyAndOrderFront(this);

这不需要一个没有实现handle参数的新构造函数 - 该解决方案正在解决我通过实例化错误的东西而创建的问题。