3

我一直在寻找这个问题的答案,虽然我意识到这可能非常微不足道,但不知怎的,答案却让我难以捉摸。

我需要显示第二个窗口(从单击菜单项启动,如果这很重要)。我非常清楚如何使用 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 元素的窗口。

4

2 回答 2

2

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

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

于 2013-01-17T23:09:47.917 回答
2

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

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

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

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

于 2013-01-18T00:59:08.630 回答