【问题标题】:Terminating windowless mac application终止无窗口 mac 应用程序
【发布时间】:2015-11-05 19:18:52
【问题描述】:

我正在通过 Xamarin 创建我的第一个 OS X 应用程序,并且我有一个无窗口应用程序,所以它只是菜单栏中的一个图标,带有一个图标和一个用于关闭应用程序的菜单。我想使用以下代码通过菜单项关闭应用程序:

public override void DidFinishLaunching (NSNotification notification)
{
    var statusItem = NSStatusBar.SystemStatusBar.CreateStatusItem(30f);
    statusItem.Image = NSImage.ImageNamed("os_logo.png");
    statusItem.HighlightMode = true;
    var menu = new NSMenu ();

    // Closing the app
    var quitItem = new NSMenuItem ("Sluit OPEN.dev", "q", delegate {
        NSApplication.SharedApplication.Terminate(NSApplication.SharedApplication);
    });
    menu.AddItem (quitItem);
    NSApplication.SharedApplication.MainMenu = menu;
    statusItem.Menu = menu;
}

但图标不会消失/应用程序不会关闭。

有人对此有解决方案吗?

【问题讨论】:

    标签: macos terminate xamarin.mac windowless


    【解决方案1】:

    在将事件委托添加到状态菜单之前,您通过将其添加到“不存在/隐藏”的 SharedApplication 菜单来隐藏它。

    如果你只需要在状态菜单项上:

    public override void DidFinishLaunching (NSNotification notification)
    {
        var statusItem = NSStatusBar.SystemStatusBar.CreateStatusItem(30f);
        statusItem.Image = NSImage.ImageNamed("madmen_icon.jpg");
        statusItem.HighlightMode = true;
    
        var menu = new NSMenu ();
    
        // Closing the app
        var quitItem = new NSMenuItem ("Sluit OPEN.dev ", "q", (s, e) => NSApplication.SharedApplication.Terminate (menu));
        menu.AddItem (quitItem);
    
        statusItem.Menu = menu;
    }
    

    仅供参考:如果您在应用程序和状态菜单上都需要相同的退出菜单项,则创建一个全新的 NSMenuItem 并将其父 (addItem) 到应用程序菜单,因为共享菜单项会导致 AppKit 崩溃:

    由于未捕获的异常而终止应用程序 'NSInternalInconsistencyException',原因:'要插入的项目 菜单已经在另一个菜单中'

    【讨论】:

    • 感谢您的解决方案和解释!
    • @SushiHangover 你知道为什么 AppKit 不喜欢两个不同菜单中的同一个菜单项吗?我们有一个案例,我们想要完全相同的项目(相同的名称、相同的等效键、相同的操作等),因此使用相同的对象非常有意义。直到我们遇到崩溃......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 2011-07-15
    • 1970-01-01
    相关资源
    最近更新 更多