使用 Xamarin 构建托盘应用程序?

Building a Tray Application using Xamarin?

我考虑使用 .NET Core 和 Xamarin 构建一个可以在 Windows 和 macOS 环境中 运行 的应用程序。

.NET Core 部分将用于所有后端内容,并将其功能作为 REST API 提供。但是,.NET Core 不支持构建本机 UI 应用程序(WPF,...),因此无法构建托盘应用程序。

所以我考虑为此使用 Xamarin。但我似乎无法弄清楚这是否可能。我也找不到任何关于如何开始的线索。

一些我尚未进一步研究的替代方案:

对于Windows,Xamarin.Forms将在3.0之前正式支持WPF。

回复:https://blog.xamarin.com/glimpse-future-xamarin-forms-3-0/

就托盘应用程序而言,它是本机 Windows 代码,不会成为 Xamarin.Forms UI 代码的一部分,但本机 Windows 代码会 show/hide 您的应用程序 UI(假设是 Xamarin.Forms)

对于 macOS,Xamarin.Forms 通过 Xamarin.Mac 得到支持,目前在 "preview" 版本中。

就相当于 macOS 上的工具栏应用程序而言,在 Xamarin.Mac 中,您可以在系统状态栏中创建一个项目(基于图标 and/or 文本)。

通常这是在 NSApplicationDelegate.DidFinishLaunching 中完成的并且很简单:

statusItem = NSStatusBar.SystemStatusBar.CreateStatusItem(NSStatusItemLength.Variable);
statusItem.Button.Image = new NSImage("moviemadness_icon_dark.png")
{
    Template = true
};
statusItem.Button.Action = new Selector("StatusItemButtonAction:");

在此示例中,只要点击状态中的 icon/text,就会触发 StatusItemButtonAction 方法,如果您同时按住 control 键,它会自行终止,否则它会运行 StatusBarPopOver,在我的例子中,它构建了一个 NSPopover 并显示了一个嵌入式 Xamarin.Forms TabbedPage UI,它显示了移动应用程序服务器状态、当前用户应用程序、应用程序分析等...

[Action("StatusItemButtonAction:")]
public void StatusItemButtonAction(NSStatusBarButton sender)
{                                     
    var currentEvent = NSApplication.SharedApplication.CurrentEvent;
    if (currentEvent.ModifierFlags.HasFlag(NSEventModifierMask.AlternateKeyMask) || 
        currentEvent.ModifierFlags.HasFlag(NSEventModifierMask.ControlKeyMask))
        NSApplication.SharedApplication.Terminate(this);
    else
        StatusBarPopOver();
}