如何关闭其他菜单项? macOS - Xamarin 表单(Visual Studio for Mac)

How do I toggle the other menu items off? macOS - Xamarin Forms (Visual Studio for Mac)

到目前为止想出这个:

    public void appearanceAuto(NSObject sender)
    {
        ((NSMenuItem)sender).State = NSCellStateValue.On;

        Application.Current.UserAppTheme = OSAppTheme.Unspecified;
        Preferences.Set("AppTheme", (int)OSAppTheme.Unspecified, "Global");
        window.Appearance = null;
    }

    [Action("appearanceLight:")]
    public void appearanceLight(NSObject sender)
    {
        ((NSMenuItem)sender).State = NSCellStateValue.On;

        Application.Current.UserAppTheme = OSAppTheme.Light;
        window.Appearance = NSAppearance.GetAppearance(NSAppearance.NameAqua);
        Preferences.Set("AppTheme", (int)OSAppTheme.Light, "Global");
    }

    [Action("appearanceDark:")]
    public void appearanceDark(NSObject sender)
    {
        ((NSMenuItem)sender).State = NSCellStateValue.On;

        Application.Current.UserAppTheme = OSAppTheme.Dark;
        window.Appearance = NSAppearance.GetAppearance(NSAppearance.NameDarkAqua);
        Preferences.Set("AppTheme", (int)OSAppTheme.Dark, "Global");
    }

它正确设置了检查项,但我不知道如何访问其他两个菜单项来关闭它们?


我设法将这些操作合并为一个这样的操作:

    [Action("appearanceChanged:")]
    public void appearanceChanged(NSObject sender)
    {
        var menuItem = (NSMenuItem)sender;
        if (menuItem == null)
            return;

        NSAppearance appearance = null;
        OSAppTheme theme = OSAppTheme.Unspecified;

        var identifier = menuItem.Identifier;
        if (identifier == "appearanceDark")
        {
            appearance = NSAppearance.GetAppearance(NSAppearance.NameDarkAqua);
            theme = OSAppTheme.Dark;
        }
        else if (identifier == "appearanceLight")
        {
            appearance = NSAppearance.GetAppearance(NSAppearance.NameAqua);
            theme = OSAppTheme.Light;
        }

        window.Appearance = appearance;
        Application.Current.UserAppTheme = theme;
        Preferences.Set("AppTheme", (int)theme, "Global");

        menuItem.State = NSCellStateValue.On;
    }
}

article 帮助了我。

Whosebug 上的一个类似问题 answer 展示了如何通过 IBOutlet 并使用它来循环菜单项来做到这一点。但是我在 Xcode 中没有这样做。我在 Visual Studio 中为 Mac 执行此操作,但我不知道该怎么做。

我看到这个 tutorial 解释了如何使用 IBAction 但它指的是连接到 ViewController.h 而我的 MacOS 项目没有这样的文件。

出于某种原因,当我尝试 CONTROL + 拖动时,它只想生成 IBAction 而不是 IBOutlet:

我现在找到了这个问题的答案。首先,我不必在我的动作处理程序中实际设置 State 。它可以在 validateMenuItem 事件处理程序中完成(我缺少)。

我必须先在 Xcode 中打开我的菜单,然后为每个菜单项分配标签 属性。然后我能够执行以下操作:

[Export("validateMenuItem:")]
public bool validateMenuItem(NSMenuItem menuItem)
{
    switch(menuItem.Tag)
    {
        case 1000:
            if (Application.Current.UserAppTheme == OSAppTheme.Unspecified)
                menuItem.State = NSCellStateValue.On;
            else
                menuItem.State = NSCellStateValue.Off;
            break;
        case 1001:
            if (Application.Current.UserAppTheme == OSAppTheme.Light)
                menuItem.State = NSCellStateValue.On;
            else
                menuItem.State = NSCellStateValue.Off;
            break;
        case 1002:
            if (Application.Current.UserAppTheme == OSAppTheme.Dark)
                menuItem.State = NSCellStateValue.On;
            else
                menuItem.State = NSCellStateValue.Off;
            break;
    }

    return true;
}

效果不错!