无错误地关闭MonoMac窗口

本文关键字:MonoMac 窗口 无错误 | 更新日期: 2023-09-27 18:01:27

我刚开始在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。句柄类型为对象,nsView是窗口上的主视图)。

一开始运行和工作都很好。但是,如果我反复点击那个按钮,最终窗口就会关闭。没有错误,没有异常,应用程序本身也不会退出;当我使用它们时,菜单继续响应并愉快地记录消息。但是这个机会已经没有了。

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

我在这里感到困惑,不知道如何进一步调试它。Xamarin是否有某种评估限制,在发生这么多事件后关闭您的窗口?这是一个框架错误吗?

无错误地关闭MonoMac窗口

但是,如果我反复点击那个按钮,最终窗口就会关闭。没有错误,没有异常,应用程序本身也不会退出;菜单当我使用它们时,继续回复并愉快地记录信息。但窗口就是没有了。

当应用程序在本机代码中严重崩溃时,有时会出现这种"消失而不留痕迹"的情况。这可能是由于绑定代码中的错误或调用本机api时发生的错误,这些错误会破坏内部cocoa状态。我相信你使用的是MonoMac,这个问题已经在Xamarin.Mac中修复了。

您有时可以从输出窗口或通过将lldb附加到您的进程中获得更多信息。

这是一个相同的问题,只是形式略有不同。

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

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

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

(是的,我觉得有点不好意思,但希望这个问题能被未来的Mac c#开发人员发现,并为他们节省一些痛苦。)