この記事では、スクリーンキャプチャツールBurageSnapにおけるMahApps.Metro 1.3.0から2.4.3への移行作業を紹介する。BurageSnapでは以下の小さなフットプリントを実現するために、MahApps.Metroを利用している。

テーマの修正
最初にテーマの設定を公式ドキュメントのMigration to v2.0に従って変更した。
Old Newスタイルの修正
それから、以下のMetroWindowのスタイル設定を修正する必要があった。MahApps 2.xのMetroWindowは、これらの動的リソースとプロパティを持っていない。
<Style x:Key="WindowStyle" TargetType="mah:MetroWindow">
...
<Setter Property="BorderBrush" Value="{DynamicResource AccentColorBrush}"/>
<Setter Property="TitlebarHeight" Value="24"/>
<Setter Property="TitleCaps" Value="False"/>
<Setter Property="WindowMinButtonStyle" Value="{StaticResource WindowButtonStyle}"/>
<Setter Property="WindowCloseButtonStyle" Value="{StaticResource WindowButtonStyle}"/>
...
AccentColorBrush
同じブラシのリソースを参照するには以下のように記述すればよい。
ウィンドウタイトル
TitlebarHeightは単純にTitleBarHeightに置き換えられた。TitleCapsはTitleCharacterCasingに置き換えられたが、値はCharcterCasing 型になっている。これらの設定を以下のように修正した。
<Setter Property="TitleBarHeight"Value="24">
<Setter Property="TitleCharacterCasing" Value="Normal"/>
ウィンドウボタン
WindowMinButtonStyleとWindowCloseButtonStyleのスタイルプロパティは、最小化ボタンと閉じるボタンを小さくするために使ってたがMahApps 2.xで削除された。
代わりに、MetroWindowの内側のWindowButtonCommandsが対応するプロパティを持っている。 Lightテーマの場合は、それぞれLightMinButtonStyleとLightCloseButtonStyleである。別のスタイルの内側のスタイルを定義する際には、以下のようにStyle.Resourcesを使用する。
上のWindowButtonStyleは、ボタンの幅をせまくするために以下のように定義していた。しかし、MetroBaseWindowButtonStyleはMahApps 2.xにはなく、これをMahApps.Styles.Button.MetroWindow.Lightと置き換える必要があった。
<Style x:Key="WindowButtonStyle" TargetType="Button" BasedOn="{StaticResource MetroBaseWindowButtonStyle}">
<Setter Property="Width" Value="26"/>
</Style>
ボタンのラベル
デフォルトのスタイルではボタンのラベルが大文字化と太字化されるが、それを無効化する以下のButtonStyleでもエラーが発生した。MetroButtonスタイルとButtonHelperクラスは2.xには存在しない。
<Style x:Key="ButtonStyle" TargetType="Button" BasedOn="{StaticResource MetroButton}">
<Setter Property="mah:ButtonHelper.PreserveTextCase" Value="True"/>
<Setter Property="FontWeight" Value="Normal"/>
</Style>
これらはそれぞれMahApps.Styles.ButtonとControlsHelperに置き換えられた。ただしControlsHelperはPreserveTextCaseではなくContentCharacterCasingを持つ。上のエラーは以下のように修正した。
次は
MahApps.Metroの移行作業はこれで終わりである。今度はPrismを6.2から8.0に移行させる必要がある。MahApps.Metro 2.xは8.0より古いPrismと互換性がない。2.xが依存するXamlBehaviors.WPFと、古いPrismが依存するWindows.Interactivityが共存できないからだ。この移行手順は別の記事で紹介する。
