在 Monomac/Xamarin C# 中创建无窗口菜单栏图标应用程序

Posted

技术标签:

【中文标题】在 Monomac/Xamarin C# 中创建无窗口菜单栏图标应用程序【英文标题】:Creating a windowless menu-bar icon application in Monomac/Xamarin C# 【发布时间】:2013-07-12 23:05:53 【问题描述】:

我正在尝试在 MonoMac/Xamarin.Mac 中创建一个应用程序,该应用程序在启动时没有停靠图标,也没有可见窗口,并且在右上角的菜单栏中只有一个图标。

我在 Info.plist 中设置了 LSUIElement = 1(尝试了 String 和 Boolean 类型),但是在应用程序启动时根本不显示状态菜单图标。我可以让它出现的唯一方法是删除 LSUIElement 标志,尽管停靠图标变得可见。

我使用的sn-p是:

public partial class AppDelegate : NSApplicationDelegate

    public AppDelegate ()
    
    

    public override void FinishedLaunching (NSObject notification)
    
        // Construct menu that will be displayed when tray icon is clicked
        var notifyMenu = new NSMenu();
        var exitMenuItem = new NSMenuItem("Quit", 
                                          (a,b) =>  System.Environment.Exit(0); ); // Just add 'Quit' command
        notifyMenu.AddItem(exitMenuItem);

        // Display tray icon in upper-right-hand corner of the screen
        var sItem = NSStatusBar.SystemStatusBar.CreateStatusItem(30);
        sItem.Menu = notifyMenu;
        sItem.Image = NSImage.FromStream(System.IO.File.OpenRead(
            NSBundle.MainBundle.ResourcePath + @"/menu_connected.png"));
        sItem.HighlightMode = true;

        // Remove the system tray icon from upper-right hand corner of the screen
        // (works without adjusting the LSUIElement setting in Info.plist)
        NSApplication.SharedApplication.ActivationPolicy = NSApplicationActivationPolicy.Accessory;
    

有没有人知道在 MonoMac 中创建没有停靠图标而只有菜单栏图标的无窗口应用程序的好方法?

谢谢,

BB

【问题讨论】:

你碰巧还有@TheNextman 提供的解决方案吗?我正在拼命寻找一种方法来实现这一点。 【参考方案1】:

尝试为“主 nib 文件名”指定 .xib

我前段时间做过这个,对我来说效果很好。像这样的:

新的 monomac 项目

在 C# 中创建了一个“AppController”类:

[Register("AppController")]
public partial class AppController : NSObject

    public AppController()
    

    

    public override void AwakeFromNib()
    
        var statusItem = NSStatusBar.SystemStatusBar.CreateStatusItem(30);
        statusItem.Menu = statusMenu;
        statusItem.Image = NSImage.ImageNamed("f3bfd_Untitled-thumb");
        statusItem.HighlightMode = true;
    

在 MainMenu.xib 中,我删除了应用程序菜单

在 MainMenu.xib 中,我添加了一个自定义对象并将其类型设置为 AppController 我在 .xib 中创建了状态菜单,然后通过插座将其连接到 AppController 在 info.plist 中,我将“Application is agent (UIElement)”值添加为字符串并将其设置为“1”

用 .xib 试试。如果它不起作用,也许我可以分享我的项目让你拆开。

【讨论】:

如果您不介意分享,我很乐意看到一个示例。网上关于这个主题的内容不多,我也在为此苦苦挣扎。谢谢! @EliGassert 试试这个:pastelink.me/dl/395e5a#sthash.iEGMVNju.dpuf AppController 类型注册在示例中类顶部的Register 声明中。它可能不会显示在下拉列表中,但您可以直接输入。 抱歉,我没有示例项目可以发布 我创建了一个包含所有文件内容的公共要点。 gist.github.com/grexican/11252656 另外,这是一个 .zip 文件,我将保留在我的公共共享中,这样它就不会像其他下载链接一样过时:letscrate.com/f/toadsoftware/public/MacStatusMenuExample.zip

以上是关于在 Monomac/Xamarin C# 中创建无窗口菜单栏图标应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Dns 无法从不同注册器中的父域解析 Route 53 中的子域

如何在 C# 中创建别名

在c#中创建一个json请求对象

在 C# 中创建 Json 的问题 [关闭]

在 C# 中创建对象的副本 [重复]

如何在 C# 中创建 COM 可见类?