この記事では、スクリーンキャプチャツール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が共存できないからだ。この移行手順は別の記事で紹介する。