MonoMac窗口关闭没有错误

我刚开始使用Xamarin Studio中的MonoMac,我遇到了一个最奇怪的问题:

我是一个带有NSButton和NSTextField的窗口。 到目前为止,我已经删除了按钮上的事件处理程序,因此它不做任何事情,除非我点击它时突出显示。 按钮创建代码如下所示:

nsButton = new NSButton(new System.Drawing.RectangleF(0, 0, 100, 100)); nsButton.BezelStyle = NSBezelStyle.RoundRect; nsButton.Font = NSFont.SystemFontOfSize( NSFont.SystemFontSizeForControlSize(NSControlSize.Regular)); nsButton.StringValue = text; 

…然后它会像这样添加到窗口中:

 nsView.AddSubview(control.Handle as NSView); 

(因为在这部分代码中,control.Handle被输入为对象,而nsView是窗口上的主视图)。

所有的运行和工作正常。 但是,如果我反复点击该按钮,最终窗口就会关闭。 没有错误,没有例外,应用程序本身也不会退出; 当我使用菜单时,菜单会继续响应并愉快地记录消息。 但窗户很简单 – 走了。

这是非常可重复的:它发生在21次点击之后。 如果我添加一个更新NSTextField的事件处理程序(例如hello.Caption =“Foo”;),那么它会在19次点击后发生。 无论是快点还是慢点都没关系; 它始终是相同的点击次数。 请注意,项目中没有关闭窗口的代码,窗口甚至没有关闭框; 我知道没有合法的方法来关闭它而不是退出应用程序。

我在这里感到困惑,不知道如何进一步调试。 在这么多活动之后,Xamarin是否有某种评估限制可以关闭你的窗户? 这是一个框架错误吗? 任何见解将不胜感激。

但是,如果我反复点击该按钮,最终窗口就会关闭。 没有错误,没有例外,应用程序本身也不会退出; 当我使用菜单时,菜单会继续响应并愉快地记录消息。 但窗户很简单 – 走了。

当应用程序在本机代码中崩溃时,有时会发生“无踪无踪”。 这可能是由于绑定代码中的错误或调用破坏内部cocoa状态的本机API时出错。 我相信你正在使用MonoMac,而且这个特殊问题已在Xamarin.Mac中得到修复。

有时,您可以从输出窗口获取更多信息,或者将lldb附加到流程中。

结果与此问题相同,只是略有不同。

简而言之,我没有保留对NSWindow对象的引用,而是让它超出范围。 因此GUI窗口会停留一段时间,但最终(在一些事件或其他代码创建幕后垃圾之后)它会被垃圾收集器注意到并处理掉。 然后拆除窗户。

一旦你想到这一点,这一切都是完全合理的,并且在Xamarin和MonoMac下都会发生(只是在略有不同的时间)。

当然,简单的解决方案是保留对窗口的引用,直到您真正完成它为止。 问题解决了!

(是的,我觉得有点羞怯,但希望未来的Mac C#开发者能找到这个问题,并为他们带来一些悲伤。)