按钮和标签文本在OSx Mojave的“黑暗”模式下不可见。是否有任何用于标识模式切换的委托方法?

时间:2018-11-18 05:26:36

标签: xamarin xamarin.mac macos-mojave macos-darkmode

我的应用程序在Mac Os Mojave中存在一些UI问题。当我切换到黑暗模式时,一些标签和按钮的文本内容不可见,因此我使用以下代码进行了一项工作。

var interfaceStyle = NSUserDefaults.StandardUserDefaults.StringForKey("AppleInterfaceStyle");
if (interfaceStyle == "Dark") {
label.textcolor = NSColor.White;
} 

这可以解决问题,但是如果我在应用程序之间切换到亮模式,则使用的标签颜色不会更改。我需要重新启动应用程序以读取代码并以默认颜色显示标签。

有人可以面对这个问题吗?用户更改Mac Os Mojave的外观模式(深色和浅色)时,是否会击中任何委托方法?

1 个答案:

答案 0 :(得分:1)

您可以使用KVO来跟踪主题更改(AppleInterfaceThemeChangedNotification)。

一些类级别的“常量”:

readonly NSString themeKeyString = new NSString("AppleInterfaceThemeChangedNotification");
readonly NSString dark = new NSString("Dark");
readonly Selector modeSelector = new Selector("themeChanged:");

ObjC选择器调用的导出方法:

[Export("themeChanged:")]
public void ThemeChanged(NSObject change)
{
    var interfaceStyle = NSUserDefaults.StandardUserDefaults.StringForKey("AppleInterfaceStyle");
    if (interfaceStyle == "Dark")
    {
        Console.WriteLine("Now Dark");
    }
        else
    {
        Console.WriteLine("Now not Dark");
    }
}

将观察者请求添加到通知中心:

NSDistributedNotificationCenter.GetDefaultCenter().AddObserver(this, modeSelector, themeKeyString, null);

注意:我通常在AppDelegate.DidFinishLaunching

中进行注册

如果不再需要观察者,则将其删除:

NSDistributedNotificationCenter.GetDefaultCenter().RemoveObserver(this, themeKeyString);

顺便说一句:NSDistributedNotificationCenter.DefaultCenter.AddObserver帮助程序/重载在这种情况下无法正常工作...