Текст кнопок и меток Не отображается в темном режиме OSx Mojave. Любой делегат Метод определения переключения режимов?
У моего приложения есть некоторые проблемы с пользовательским интерфейсом в Mac Os Mojave. Некоторые ярлыки и текстовое содержимое кнопок не видны, когда я переключился в режим Dark Mode. Поэтому я сделал один обходной путь, используя следующий код.
var interfaceStyle = NSUserDefaults.StandardUserDefaults.StringForKey("AppleInterfaceStyle");
if (interfaceStyle == "Dark") {
label.textcolor = NSColor.White;
}
Это решает проблемы, но если я переключился обратно в светлый режим между приложениями, использование метки не изменит цвет. Мне нужно перезапустить приложение, чтобы прочитать код и отобразить метку с цветом по умолчанию.
Может ли кто-нибудь сталкивался с этой проблемой? Есть ли какой-нибудь метод делегата, который срабатывает, когда пользователь меняет режим внешнего вида (Dark & Light) в Mac Os Mojave?
2 ответа
Ты можешь использовать 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
помощники / перегрузки не работают должным образом в этом случае...
По крайней мере, мне кажется, что последняя строка ответа SushiHangover вызывает сбой в macOS Monterey и последней версии Xamarin. Вместо этого для меня работает:
NSDistributedNotificationCenter.GetDefaultCenter().RemoveObserver(this);