Текст кнопок и меток Не отображается в темном режиме OSx Mojave. Любой делегат Метод определения переключения режимов? - PullRequest
0 голосов
/ 18 ноября 2018

У моего приложения есть некоторые проблемы с пользовательским интерфейсом в Mac Os Mojave. Некоторые ярлыки и текстовое содержимое кнопок не видны, когда я переключился в темный режим. Поэтому я сделал один обходной путь, используя следующий код.

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

Это исправляет проблемы, но если я переключился обратно в светлый режим между приложениями, использование ярлыка не изменится. Мне нужно перезапустить приложение, чтобы прочитать код и отобразить ярлык с цветом по умолчанию.

Может ли кто-нибудь сталкивался с этой проблемой? Есть ли какой-нибудь метод делегата, который срабатывает, когда пользователь меняет режим внешнего вида (Dark & ​​Light) в Mac Os Mojave?

1 Ответ

0 голосов
/ 18 ноября 2018

Вы можете использовать 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 помощники / перегрузки не работают должным образом в этом случае ...

...