WinUI3でライト、ダークのテーマの切り替えを、システムボタンにも反映させたい!
こちらの投稿に触発されて、アプリにテーマ切り替えを導入したい!と再び思いました。
カスタムタイトルバーを利用していたのですが、以前、テーマ切り替えボタンを試した時は、なんだか中途半端な色変えで、アレ??と思っていたのですが、どうやらxamlで背景の指示をしていなかったためのようです。
<Grid x:Name="RootGrid" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
・・・
<AppBarButton Click="ToggleThemeButton_Click" Margin="8,0,0,0" ToolTipService.ToolTip="Change Theme">
<AppBarButton.Icon>
<FontIcon Glyph=""/>
</AppBarButton.Icon>
</AppBarButton>
private void ToggleTheme()
{
// ルートの Grid(ここでは RootGrid)の ActualTheme プロパティで、現在のテーマをチェック
if (RootGrid.ActualTheme == ElementTheme.Light)
{
RootGrid.RequestedTheme = ElementTheme.Dark;
}
else
{
RootGrid.RequestedTheme = ElementTheme.Light;
}
}
テーマ変更の☀ボタンを押すと↓
いたはずの最大化、最小化、閉じるボタンがいなくなった!
・・・のではなくて、マウスを持っていくと見える!
最大化、最小化、閉じるボタンはシステムボタンで、アプリでのテーマ切り替えには左右されず、Windowsのシステム設定値のままらしい。
カスタムタイトルバーを使えばできますよ?
とCopilotは言うけれど、これがなかなか実現できなくて。
で、いろいろ遠回りして、最終的にWinUI 3 Gallery
に載ってた方法で実現できそうな目途がついたので、おすそ分け。
最近更新されたのか、Windowing > TitleBar にありました。
// Retrieve the main window and extend its content into the title bar for custom styling.
Window window = App.MainWindow;
window.ExtendsContentIntoTitleBar = true;
// Set the preferred height option for the title bar
window.AppWindow.TitleBar.PreferredHeightOption = TitleBarHeightOption.Collapsed;
(設定した内容が、リアルタイムに反映されるので、すごいですよね、このアプリ)
手順的には、
- カスタムタイトルバーを作る
- 上記のコードでシステムボタンの高さを無しにする
- 必要に応じて閉じるボタン、最大化、最小化ボタンをつくる
この手順がWinUI3で完結していて、スッキリと実装できそうです。
暫定で、雑に閉じるボタンだけ実装してみましたが、
テーマ切り替えしても、アプリのボタンなので、ちゃんと色変えに追従してくれます。
その他の方法(3つ全てを無効にできなかった方法)
最大化、最小化の無効化は、次の記事を参考にできました。
閉じるボタンはどのようにするのかと探して、下記を見つけたのですが、結局うまくいきませんでした。
他にも、システムボタンの色を透明にしようとするなど、いくつか試してみたのですが結局うまくいかず、ボタンをいい感じに重ねるしかないのかなー?
と思っていた矢先、TitleBarHeightOption.Collapsed
を見つけました。
あとはいい感じに閉じるボタンとかをレイアウトするだけ・・・!