首页 文章

按钮和标签文本在OSx的黑暗模式下不可见Mojave.Any delegate识别模式切换的方法?

提问于
浏览
0

我的应用程序在Mac Os Mojave中有一些UI问题 . 当我切换到Dark Mode时,一些标签和按钮文本内容不可见 . 所以我使用以下代码做了一个workaroud .

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

这解决了问题,但是如果我在应用程序之间切换回轻模式使用标签颜色将不会改变 . 我需要重新启动应用程序以读取代码并使用默认颜色显示标签 .

任何人都可以面对这个问题吗?当用户更改Mac Os Mojave的外观模式(Dark&Light)时,是否有任何委托方法?

1 回答

  • 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);
    

    BTW: NSDistributedNotificationCenter.DefaultCenter.AddObserver 助手/重载在这种情况下无法正常工作......

相关问题