質問

I'm just starting out with MonoMac in Xamarin Studio, and I've run into the strangest problem:

I a window with an NSButton and a NSTextField on it. By this point I've cut out the event handler on the button, so it doesn't DO anything, except highlight when I click it. The button creation code looks like this:

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;

...and then it gets added to the window like so:

nsView.AddSubview(control.Handle as NSView);

(because in this part of the code, control.Handle is typed as object, and nsView is the main view on the window).

All runs and works fine at first. But, if I click repeatedly on that button, eventually the window just closes. No error, no exception, and the app itself doesn't quit; menus continue to respond and cheerfully log messages when I use them. But the window is simply -- gone.

It's extremely repeatable: it happens after 21 clicks. If I add an event handler that updates the NSTextField (e.g. hello.Caption="Foo";), then it happens after 19 clicks. It doesn't matter whether I click fast or slow; it's always the same number of clicks. Note that there is no code in the project to close the window, and the window doesn't even have a close box; I know of no legitimate way to close it short of quitting the app.

I am baffled here, and don't know how to debug this further. Does Xamarin have some sort of evaluation limit that closes your windows after so-many events? Is it a framework bug? Any insight will be greatly appreciated.

役に立ちましたか?

解決 2

This turned out to be the same issue as this one, in a slightly different guise.

In short, I wasn't keeping a reference to the NSWindow object, but instead was letting it go out of scope. So the GUI window would stick around for a while, but eventually (after some number of events or other code creating behind-the-scenes garbage) it is noticed and disposed of by the garbage collector. The window is then torn down.

It's all perfectly reasonable once you think of it, and happens under both Xamarin and MonoMac (just at slightly different times).

The simple solution, of course, is to retain a reference to the window until you're truly done with it. Problem solved!

(And yes, I feel a bit sheepish, but hopefully this question will get found by future Mac C# developers, and save them some grief.)

他のヒント

But, if I click repeatedly on that button, eventually the window just closes. No error, no exception, and the app itself doesn't quit; menus continue to respond and cheerfully log messages when I use them. But the window is simply -- gone.

This "disappearing without a trace" sometimes occurs when an application crashes in native code badly enough. This can occur due to bugs in the binding code or mistakes made in calling the native APIs that corrupt internal cocoa state. I believe you are using MonoMac, and that this particular issue has been fixed in Xamarin.Mac.

You can sometimes get more information from the output window or by attaching lldb to your process.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top