もくじ
https://tera1707.com/entry/2022/02/06/144447
やりたいこと
こういうプロジェクト構成をしているときに、
Imagesフォルダの下の言語毎のフォルダ(ruとかdeとか)の下にある画像を表示させるこういうxamlを書くと、
<Image Source="ms-appx:///Images/myimage.bmp" Width="100" Height="100"/>
なぜか、勝手にいい感じに画像を切り替えてもらえる。
しかしたまたまそうなっただけで、なんでそうなるのか?がさっぱりわからない。
なんでうまくいっちゃうのか?調べたい。
結論
「ms-appx:」が行ってくれる
「コンテントネゴシエーション」
というもののおかげで、切り替えが行われていた。
しらべたこと
ここに、そうなるんですよと書いてあった。
どうも、"ms-appx:///Images/myimage.bmp" の部分は、「パス」として扱われているようで、そのパスは、実行時に、「コンテントネゴシエーション」というのを経て決定されるとある。
その「コンテントネゴシエーション」は、OSや言語などの設定、ディスプレイのスケール、テーマ、コントラスト設定などによって決まるらしい。
で、サンプルによると、
「ms-appx:///images/logo.png」
は
「\Images\fr-FR\logo.scale-100_contrast-white.png」
を指すことになる場合があるとのこと。
たぶんこの例の場合は、言語と、ディスプレイのスケールとコントラスト設定が入ったのだと思われる。
で、私の場合は、
Source="ms-appx:///Images/myimage.bmp"
だったのだが、これに対してその「コンテントネゴシエーション」というのを経た結果、 プロジェクト構成の中で存在していたのが、
「Images\de\myimage.bmp」もしくは「Images\ru\myimage.bmp」
だったので、de(ドイツ語)とru(ロシア語)でうまく切り替えしてくれたものと思われる。
なので、今回たまたま言語のフォルダ分けをしててそういう動きをしてもらえたが、うまくやれば、ディスプレイのスケールによって画像を切り替えてもらう、とかもできそう。(たぶんやらないけど)
その他、気づいたこと
ms-appx
は、そういう「コンテントネゴシエーション」をしてくれると分かったのだが、同じMSのページを見ると、
ms-appdata
というのもあり、そっちのほうは、コンテントネゴシエーションが行われないとある。
そういう、自動で切り替えたりしてほしくない場合は、ms-appdata
の方を使う、とかの使い分けがあるのかもしれない。(未検証)
追記 フォルダ/ファイル名のルールとサンプル
下記ページに、ルールが書かれてた。
https://learn.microsoft.com/en-us/windows/uwp/app-resources/tailor-resources-lang-scale-contrast
ルール
フォルダ名に適用したサンプル
ファイル名に適用したサンプル
こういうルールでフォルダを作ってやり、そこに各言語、各モード(ダークライト、ハイコントラスト)に応じた画像ファイルを入れてやれば、自分のコードで切り替えとかしなくて済みそう。
表示言語についてはここに書いてある。
コードから同じことをする
下のページのようにすればよい。(未検証)
参考
ms-appdata を パスで使う場合
https://learn.microsoft.com/en-us/windows/uwp/app-resources/uri-schemes#path-ms-appx-and-ms-appx-web
言語、スケール、ハイ コントラスト、およびその他の修飾子に合わせてリソースを調整します
→どういうフォルダorファイル名にしたらどういうパスの切り替えができるかのルール。
(このページの内容が、知りたかったことズバリ)
https://learn.microsoft.com/en-us/windows/uwp/app-resources/tailor-resources-lang-scale-contrast
スケール、テーマ、ハイ コントラストなどに合わせて調整された画像とアセットを読み込む