我刚开始使用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是否有某种评估限制可以关闭你的窗口?它是一个框架错误吗?任何见解将不胜感激。
答案 0 :(得分:1)
但是,如果我反复点击该按钮,最终只是窗口 关闭。没有错误,没有异常,应用程序本身也不会退出;菜单 我使用它们时继续回复并愉快地记录消息。但 窗户很简单 - 走了。
当应用程序在本机代码中严重崩溃时,有时会出现“无迹可寻的消失”。这可能是由于绑定代码中的错误或调用破坏内部可可状态的本机API时出错。我相信您使用的是MonoMac,并且Xamarin.Mac已修复此特定问题。
您有时可以从输出窗口获取更多信息,或者将lldb附加到您的流程中。
答案 1 :(得分:0)
这与this one的问题相同,只是略有不同。
简而言之,我并没有保留对NSWindow对象的引用,而是让它超出范围。因此GUI窗口会停留一段时间,但最终(在一些事件或其他代码创建幕后垃圾之后),垃圾收集器会注意到并将其处理掉。然后窗户被拆除。
一旦你想到它就完全合理,并且在Xamarin和MonoMac下都会发生(只是在略有不同的时间)。
当然,简单的解决方案是保留对窗口的引用,直到您真正完成它为止。问题解决了!
(是的,我觉得有点羞怯,但希望未来的Mac C#开发人员能找到这个问题,并为他们带来一些悲伤。)