WinUI3のコントロールの標準style(generic.xaml)のありか

もくじ
https://tera1707.com/entry/2022/02/06/144447/WinUI3

やりたいこと

WinUI3で「標準のコントロールのstyleやテンプレート」を取ってくるために、以前、下記の記事で、generic.xamlを取ってくればいいということを調べた。

その時は、C:\Program Files (x86)\Windows Kits\10\DesignTime\CommonConfiguration\Neutral\UAPにあるものを使ってた。

その記事でやったときにもうまくは行っていたのだが、なんとなく「あれ?generic.xamlからstyleをとってくると、トグルスイッチの見た目が違う?」「あれ、なんかチェックボックスの見た目が違う?」みたいな違和感を感じることがあった。(違和感感じてたがちょっとくらい見た目違っても、そもそも見た目を変えるためにやってたことなので支障がなくてそのまま使ってた)

とどめに、NavigationViewをいじりたくてgeneric.xamlの中のNavigationViewのstyleを使うと、ビルドしたときに「NavigationViewListがないよ」と怒られた。

標準のstyleを使ってるはずなのに、見た目がちょっと変わってしまったり、ビルドできなくなるのはなぜ?調べる。

やったこと その1

下記に答えがあった。

github.com

上記issueによると、C:\Program Files (x86)\Windows Kits\10\DesignTime\CommonConfiguration\Neutral\UAPにあるgeneric.xamlはUWP向けの標準styleらしい。
(NavigationViewListのmsdocsによると、WinUI3ではなく、WinUI2のコントロールとのこと)

なので、WinUI3でそのgeneric.xamlを使うと、ちょっと見た目が変わったり、モノによってはビルドできないときがある様子。

WinUI3で標準のstyleを使いたい場合は、

"%USERPROFILE%\.nuget\packages\microsoft.windowsappsdk\<windowsAppSDKのバージョン>\lib\uap10.0\Microsoft.UI\Themesのなかにあるgeneric.xamlを見てやる。

例えば、WindowsAppSDKの1.1.3を使ってる場合は、

C:\Users\<ユーザー名>\.nuget\packages\microsoft.windowsappsdk\1.1.3\lib\uap10.0\Microsoft.UI\Themes\generic.xaml をみる。

やったこと その2(2022/10/6追記)

下記のページに、さらにそれっぽいやり方が書かれていた。

stackoverflow.com

このページによると、

  • 自分のxamlの中に、元からある組み込みのstyle(例えばボタンのスタイルStyle="{StaticResource ButtonRevealStyle}")を書く
  • そのスタイルにカーソルを合わせて‘F12‘キーを押し、定義を表示する
  • styleが定義されているgeneric.xamlが開くので、そのパスを見る

ということをすると、標準のstyleが定義されているxamlを見ることができるとのこと。

このページには、

C:\Program Files (x86)\Windows Kits\10\DesignTime\CommonConfiguration\Neutral\UAP\10.0.18362.0\Generic

に、標準のgeneric.xamlがあると書いてあるが、2022/10月時点の私の環境では、

C:\Users\<ユーザー名>\.nuget\packages\microsoft.windowsappsdk\1.1.3\lib\net5.0-windows10.0.18362.0\Microsoft.WinUI\Themes

にあるgeneric.xamlが開いた。

もしかすると、この記事が書かれた時点(2022/10月に1年と10か月前の記事だとあるので、2021/1月頃か)の時点のWinUI3環境でこの操作をしたときには、前者の方のgeneric.xamlが開いていたのかもしれない。

※そもそも、前者のほうは、ビルドできなくて何とかしたいほうのgeneric.xamlなので、WinUI3でも、時期やバージョンによって、デフォルトのスタイルも変わってきてるのかもしれない。

結果

上記のgeneric.xamlにあるNavigationViewをコピーしてきてWinUI3で使うと、エラーなくビルドすることができた。
(その1、その2どちらのものを使っても、うまくビルドできた。)

やり方2のF12でgeneric.xamlを開く方法なら、今現在実際に使っているgeneric.xamlを開けるので(開いてそうなので)、WinUI3のバージョンが上がって使う標準styleが変わっても問題なさそう。

参考

解決のきっかけになったissue

github.com

解決のきっかけになったstackoverflow

stackoverflow.com

NavigationViewListは、WinUI2のコントロールだった。つまり、そのとき使っていたNavigationViewは、WinUI2(もしくはUWP?)向けのものだった

https://learn.microsoft.com/ja-jp/windows/winui/api/microsoft.ui.xaml.controls.navigationviewlist?view=winui-2.3

参考書

WinUI3

WinUI3でアプリを作ろうと思ったときのとっかかりによかった。 msdocsに書いてある情報を、体系的に、順番に読みたいな、というときによいかも。(ただし英語)
この本で分からなかった、かゆいところに手が届かなかった部分を私は記事にしてる感じ。

C#①

表紙に書いてある通り、教科書として最適。 これからC#を勉強したいけど、ネットだけで勉強するのは効率が悪いから体系的に学べる本が欲しいときや、 ちょっとC#を勉強してコード書けるようになったけど、もう少し広く深く知りたいなというときによいと思う。
私は仕事で触れるコードを軸に、基本ネットで断片的にC#を学んだので、その知識の隙間を埋めて枝葉を広げるためにとても分かりやすかった。

C#②

C#の文法的に色々できるのは分かったが、いざ実装するときに、わかったことを使ってどう実装すればいいのか?と悩んだときに指針になりそうな本。
「プロパティ等の名前の付け方、どうすればいい?」「情報をクラス外部に見せるときに、プロパティにすべき?メソッドにすべき?」「異常だと判定したいとき、どんなときにどんな例外をスローすべき?」などなど、勉強になる部分が山ほどあった。
私のように「コードは書くけどこれであってるのか自信がない、レビューで指摘されるのが嫌だ、実装時の(心の)よりどころが欲しい」という人に最適。