C# MonoMac窗口关闭无误
我刚开始在Xamarin工作室使用MonoMac,我遇到了一个最奇怪的问题: 我创建了一个带有NSButton和NSTextField的窗口。至此,我已经删除了按钮上的事件处理程序,因此它不做任何事情,只在单击它时突出显示。按钮创建代码如下所示:C# MonoMac窗口关闭无误,c#,events,mono,window,monomac,C#,Events,Mono,Window,Monomac,我刚开始在Xamarin工作室使用MonoMac,我遇到了一个最奇怪的问题: 我创建了一个带有NSButton和NSTextField的窗口。至此,我已经删除了按钮上的事件处理程序,因此它不做任何事情,只在单击它时突出显示。按钮创建代码如下所示: nsButton = new NSButton(new System.Drawing.RectangleF(0, 0, 100, 100)); nsButton.BezelStyle = NSBezelStyle.RoundRect; nsButton
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是否有某种评估限制,在这么多事件之后关闭您的窗口?这是一个框架错误吗?如有任何见解,将不胜感激
但是,如果我反复点击这个按钮,最终窗口就会
关闭。没有错误,没有例外,应用程序本身也不会退出;菜单
当我使用信息时,继续回复并愉快地记录信息。但是
窗户简直——不见了
当应用程序在本机代码中严重崩溃时,有时会出现这种“消失而不留痕迹”的情况。这可能是由于绑定代码中的错误或调用破坏内部状态的本机API时出错造成的。我相信您正在使用MonoMac,并且这个特定问题已经在Xamarin.Mac中修复
有时,您可以从输出窗口或通过将lldb附加到您的进程来获取更多信息。这与以稍微不同的形式出现的问题是相同的 简而言之,我没有保留对NSWindow对象的引用,而是让它超出范围。因此GUI窗口会停留一段时间,但最终(在一些事件或其他代码创建后台垃圾后)它会被垃圾收集器注意到并处理掉。然后窗户被推倒 只要你想一想,这一切都是完全合理的,发生在Xamarin和MonoMac两种情况下(只是时间略有不同) 当然,一个简单的解决方案是保留对窗口的引用,直到您真正使用它为止。问题解决了
(是的,我觉得有点不好意思,但希望这个问题能被未来的Mac C#开发者发现,让他们省去一些痛苦。)我终于(在Xamarin支持的帮助下)安装了Xamarin.Mac,我很高兴地报告,这个错误似乎没有在那里发生。所以,我想我可以把这归结为MonoMac中的一个奇怪的错误,它似乎已经在Xamarin.Mac中修复了。但是如果应用程序真的崩溃了,它就不会有(工作)菜单栏和菜单了,是吗?