我一直在寻找这个问题的答案,虽然我意识到这可能非常微不足道,但不知怎的,我得到了答案。
我需要显示第二个窗口(通过单击菜单项启动,如果这很重要)。我非常清楚如何用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元素的窗口。
答案 0 :(得分:2)
只需添加一个没有handle参数的默认构造函数。确保MyWindowClass子类化NSWindow,它应该可以工作。
此外,您可能需要保持对myWindow的引用 - 这样就不会收集垃圾。
答案 1 :(得分:2)
为清楚起见,这是解决问题的最终代码,如果其他任何人都在谷歌这个:
由于我用控制器创建了一个新的monomac窗口,我需要创建该控制器的一个实例,并显示控制器的窗口:
MyWindowController myWindow = new MyWindowController();
myWindow.Window.MakeKeyAndOrderFront(this);
这不需要一个没有实现handle参数的新构造函数 - 该解决方案正在解决我通过实例化错误的东西而创建的问题。