如何关闭其他菜单项? 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;
}
效果不错!
到目前为止想出这个:
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;
}
效果不错!