モノトーンの伝説日記

OBS Studio と Blackmagic Design が大好き。

<mini> #UWP で“アクセントカラー”、“ハイコントラストおよび色”などのシステムリソースをコード上で監視する。

 結構めんどくさいですがフックをちゃんとすれば問題ない。

 Windows 10 では Windows Phone 由来のアクセントカラーの設定変更があります。また、Windows 10 Mobile 限定ですが、濃色と淡色の設定変更があります (有機EL ディスプレイは自発光素子なため、黒は光らせる必要がなくなるので黒ベースだと消費電力が下がりますためにこのような設定があります)

 これらはイベントがないように見えますが、単に CoreWindow.Activated を監視するだけでいいです。

public X()
{
  CoreWindow.GetForCurrentThread().ColorValuesChanged += this.OnColorValuesChanged;
}

private void OnWindowActivated(CoreWindow sender, WindowActivatedEventArgs args)
{
  if (Application.Current.RequestedTheme == ApplicationTheme.Light)
  {
    // light theme
  }
  else
  {
    // dark theme
  }
}

 アプリ製作者のほとんどは気にしてないアクセシビリティ対応のことについてももちろん書きます。

 ハイコントラストや色の変化を監視したいですよね。そのときは、

public Y()
{
  new AccessibilitySettings().HighContrastChanged += this.OnHighContrastChanged;
  new UISettings().ColorValuesChanged += this.OnColorValuesChanged;
}

private void OnHighContrastChanged(AccessibilitySettings sender, object args)
{
  var isHighContrast = sender.HighContrast;
  if (isHighContrast)
  {
    // high contrast mode
  }
  else
  {
    // default
  }
}

private void OnColorValuesChanged(UISettings sender, object args)
{
  // color changed
  var textHigh = sender.UIElementColor((UIElementType)1001); // 注釈
}

とすればよいでしょう。

 なおキャストしている理由は前記事をご覧ください。

mntone.hateblo.jp

 なおここに書いてあるコードは UWP Desktop でも問題なく動きます。濃色、淡色自体は設定できませんがアクセントカラーの変化は 1 つめの方法で取れるのでコードでアクセントカラーをごにょって何かしている場合はかなり有効でしょう。もし、濃色淡色だけほしいなら Windows.System.Profile.AnalyticsInfo.VersionInfo.DeviceFamily == "Windows.Mobile" を使えばいいと思います。

 以上。

追記

 ハイコントラストモードの場合タイトルバーの色自体、アプリ側から指定できない見たいです (故にハイコントラストモードのタイトルバーの色は気にする必要がない)