Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MonoMac窗口关闭无误_C#_Events_Mono_Window_Monomac - Fatal编程技术网

C# MonoMac窗口关闭无误

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

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

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

当应用程序在本机代码中严重崩溃时,有时会出现这种“消失而不留痕迹”的情况。这可能是由于绑定代码中的错误或调用破坏内部状态的本机API时出错造成的。我相信您正在使用MonoMac,并且这个特定问题已经在Xamarin.Mac中修复


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

这与以稍微不同的形式出现的问题是相同的

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

只要你想一想,这一切都是完全合理的,发生在Xamarin和MonoMac两种情况下(只是时间略有不同)

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


(是的,我觉得有点不好意思,但希望这个问题能被未来的Mac C#开发者发现,让他们省去一些痛苦。)

我终于(在Xamarin支持的帮助下)安装了Xamarin.Mac,我很高兴地报告,这个错误似乎没有在那里发生。所以,我想我可以把这归结为MonoMac中的一个奇怪的错误,它似乎已经在Xamarin.Mac中修复了。但是如果应用程序真的崩溃了,它就不会有(工作)菜单栏和菜单了,是吗?