带图片:http://www.netneurotic.net/Mono/MonoMac-windowWillClose.html
这里的技巧是创建一个调用Environment.Exit()方法来退出应用程序的方法,就像其他.NET应用程序一样。
另一个诀窍是注意到当Cocoa对象存在时,Environment.Exit()不起作用。但是NSApplication.SharedApplication.Terminate(this)可以工作。我不知道如何以这种方式返回错误代码。
Cocoa,因此MonoMac,使用“委托”允许一个对象在另一个对象发生某些事情时做出反应。我们将使用这个概念,在主窗口关闭时调用Terminate()。
Cocoa对象有“插座”,它们似乎是指向其他对象的指针。我不知道这是否是技术上正确的描述。这没关系。其中一个插座是“委托”,我们将把它设置为包含我们想要在窗口关闭时调用的方法的对象。因此,我们必须将主窗口的委托插座设置为我们的对象。
我们将使用MainWindow.cs中定义的MainWindow类作为主窗口的委托。我猜这意味着我们正在使用一个对象作为自己的委托或类似于那样的东西。它仍然有效。
要使MainWindow成为主窗口的委托并响应主窗口关闭,请按照以下步骤进行。
双击MainWindow.xib以打开Xcode。
在Xcode中找到主窗口。它是一个看起来像窗口的大东西。
图片1:标题为“Window”的大东西是主窗口。
- 右键单击窗口的标题栏以显示窗口的输出口。
您将看到一个名为“delegate”的输出口。
图片2:其中一个“输出口”是“delegate”。
- 找到“对象库”和其中的蓝色框。蓝色框是一个对象。
图片3:蓝色框是一个对象。
- 将蓝色框拖到窗口左侧带有图标的灰色区域。
图片4:蓝色框属于窗口图标下方。
- 将蓝色框变成“MainWindow”对象。单击蓝色框并将其类更改为“MainWindow”。
图片5:更新蓝色框的类名。
- 按住控制键并从窗口标题栏拖动到蓝色框中。然后在出现的菜单中选择“delegate”选项。
图片6:当你控制拖动时出现的菜单。
现在我们的MainWindow对象是主窗口的代理。这意味着它可以对窗口发生的事情做出反应。
将以下代码添加到MainWindow.cs中:
[Export("windowWillClose:")]
public void WindowWillClose(NSNotification notification)
{
Console.WriteLine("windowWillClose:");
NSApplication.SharedApplication.Terminate(this);
}
[Export ("windowWillClose:")]语句告诉编译器(可能是编译器,但也可能是其他一些实用程序技术上被告知的),以下方法声明是Objective-C方法的C#等效方法。该方法可以有不同的实际名称,但应该命名得足够相似,以便我们可以轻松地识别它。我通常只是将第一个字母更改为其大写版本,以符合C#风格。
- 编译应用程序,修复您所做的所有拼写错误,然后运行它。尝试关闭窗口。应用程序将退出。
如果没有,请重复执行此处指示的所有步骤,直到它成功。