【问题标题】:MonoMac window closing without errorMonoMac 窗口关闭时没有错误
【发布时间】:2014-05-02 16:35:45
【问题描述】:

我刚开始在 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 是否有某种评估限制,在发生这么多事件后会关闭您的窗口?它是一个框架错误吗?任何见解将不胜感激。

【问题讨论】:

  • 我终于设法(在 Xamarin 支持的帮助下)安装了 Xamarin.Mac,我很高兴地报告那里似乎没有出现此错误。所以,我想我可以将其归结为 MonoMac 中的一个奇怪错误,该错误似乎已在 Xamarin.Mac 中修复。

标签: c# events mono window monomac


【解决方案1】:

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

当应用程序在本机代码中严重崩溃时,有时会发生这种“消失得无影无踪”的情况。这可能是由于绑定代码中的错误或调用破坏内部可可状态的本机 API 时出错。我相信您使用的是 MonoMac,并且此特定问题已在 Xamarin.Mac 中得到修复。

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

【讨论】:

  • 但如果应用程序真的崩溃了,它不会仍然有(工作的)菜单栏和菜单,不是吗?
【解决方案2】:

这与this one 是同一问题,但形式略有不同。

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

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

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

(是的,我觉得有点害羞,但希望这个问题会被未来的 Mac C# 开发人员发现,并为他们节省一些痛苦。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    相关资源
    最近更新 更多