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

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

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

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

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


person Mohammed Abid    schedule 18.11.2018    source источник


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

person SushiHangover    schedule 18.11.2018
comment
Ты всегда спасаешь день, @SushiHangover! - person Martin Zikmund; 28.07.2020