カラー設定の話(UWP/C#)

 UWPでは多くのコントロールのプロパティに「Foreground」と「Background」があります。これを設定するだけで色は変わります。xamlで指定しても、コード中で指定してもどっちでもいいです。
 ただ、直接カラー値(#FFFF0000とか)を指定するとアプリが動かなくなるケースがありますので注意しましょう。

ハイコントラスト設定

 Windows本体の色設定として、ハイコントラスト設定というものがあります。デスクトップで右クリック/個人用設定を開くと「関連設定」のところに出てきます。
 このハイコントラスト設定では、ユーザーが見やすい色をフォントや背景など、個別に指定してカスタマイズできるようになっています。ですがその代わりに、使える色がかなり制限されています。このため、アプリで直接カラー設定してしまっていると、ハイコントラスト環境ではエラーになることがあります。
 テストは簡単です。一度Windowsをハイコントラスト設定にしてから、アプリを起動してみましょう。ハイコントラスト設定の中でさらにいくつかのカラーパターンを選べるようになっていますので、それぞれ試してみてください。エラーになる場合は後述の回避策をお試しください。

エラー回避策

 この問題が発生する理屈と回避策については、公式が詳しく解説してくれています。回避策というか、「こう作ってね」という説明書なので、最初に読んでおくと良いと思います。

https://docs.microsoft.com/ja-jp/windows/uwp/design/accessibility/high-contrast-themes

 流れとしては、テーマごとにブラシを定義して、カラーを指定するのではくブラシを指定すれば良い、みたいな感じです。

 App.xamlでアプリのテーマ指定をしている場合(RequestedTheme=”Light”など)であっても、Windows本体がハイコントラスト設定であれば、適用されるのはHighContrastテーマです(強制適用されます)。ということで、xamlにてLightやDefaultテーマのブラシを定義したなら、HighContrastテーマにもブラシを定義してください。x:Keyは同じもの、x:Nameは異なるものにすれば動作するはずです。
 そして、HighContrastテーマでは定義したブラシを使わないようにします。そうすれば、Windows本体のハイコントラスト設定の色使いが、そのままアプリに適用されます。ハイコントラスト設定をしている人は、その色づかいじゃないと困る、という場合が多いと思いますので、アプリで勝手に色をつけるのは避けた方が良いと思います(主観です)。

 ちなみに自作アプリの「My Little Tree」ではハイコントラスト設定でアプリを起動すると、アプリ内の色設定を非表示にして、変更できなくしています。この対策は実をいうと不十分で、通常のWindows設定でアプリを起動してからハイコントラスト設定に切り替えると、アプリ内での色変更ができてしまいます。わざわざそんなことをする人はいないだろうと思ってますので、内緒にしておいてください。

溟犬一六(Ichiro Meiken)
  • 溟犬一六(Ichiro Meiken)
  • フリーランスのWEBクリエイター。小説、ゲーム、アプリなど幅広く活動中。
    Twitter : @dawn_gabacho