如何解决如何关闭其他菜单项? 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 帮助了我。
这个 answer 到 StackOverflow 上的一个类似问题展示了如何通过使用 IBOutlet
并使用它来循环菜单项来做到这一点。但我不是在 Xcode 中这样做。我正在 Visual Studio for Mac 中执行此操作,但我不知道该怎么做。
我看到关于使用 IBAction
的这个 tutorial 解释,但它指的是连接到 ViewController.h
并且我的 MacOS 项目没有这样的文件。
出于某种原因,当我尝试 CONTROL + Drag 它只想制作一个 IBAction 而不是 IBOutlet:
解决方法
我现在找到了这个问题的答案。首先,我不必在我的操作处理程序中实际设置 State
。它可以在 validateMenuItem
事件处理程序中完成(这是我所缺少的)。
我必须首先在 Xcode 中打开我的菜单并为每个菜单项分配 Tag 属性。然后我能够执行以下操作:
[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;
}
效果很好!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。