WindowsでGUIアプリケーションを作成する際に、
OSによってコントロールの見た目が変わることがあります。
例えばフォントにしても以下のようにデフォルトが異なります。
OS | システムフォント |
---|---|
Windows XP | MS UI Gothic |
Windows 7 | Meiryo |
Windows 10 | Yu Gothic UI |
これによって、各OSによってレイアウトが崩れることが良くあります。
最近はWindow7から10へのリプレースをする機会が増えてきているかと思いますが、
その際には注意が必要です。
実際あったケースとしては、
開発環境はWindows7のまま、本番環境はWindows10という状況で、
検証に回すと挙動が異なる、という報告がありました。
『コンボボックスが特定の項目を選択している場合のみ色替えを行う』という仕様でしたが、
色が変化しない、という報告。
確かに確認すると色が変化しないけど、開発環境では問題なく動作する。
で、色々と調べてみると本題であるOSの問題。
コンボボックスの見た目も7と10で異なります。
・Windows7の場合
・windows10の場合
この影響で色替えが正しく動いていませんでした。
で、ようやく今回書きたかったこと。
Windows7上では正しく動作していたのでWindows10でも同様のレイアウトにしたい。
その場合は以下のように指定することで解決します。
<Application x:Class="WPFTest.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfTest"
StartupUri="MainWindow.xaml">
<Application.Resources>
<ResourceDictionary Source="/PresentationFramework.Aero;component/themes/aero.normalcolor.xaml" />
</Application.Resources>
</Application>
上記の例ではApp.xamlに記載しています。
そうすることでアプリケーションの規定値として指定することが出来ます。
Windows7以外のOS準拠にしたい場合はそれぞれ以下を指定すればOKです。
OS | 指定するテーマ |
---|---|
Windows XP | presentationframework.Aero |
Windows 7 | presentationframework.Aero |
Windows 10 | presentationframework.Aero2 |
ちなみに指定する為には対応するテーマをプロジェクト参照に追加する必要があるので注意。
で、大抵はこれで解決すると思いますが、
私の場合はまだ解決しませんでした。
上記指定しても問題のコンボボックスはWindows10の見た目のまま…。
更に調べていくと該当コントロールにStyleを指定していたことが原因でした。
Styleを継承する場合は、BasedOnプロパティで、以下のように継承元を指定します。
<Style TargetType="ComboBox" BasedOn="{StaticResource ResourceKey={x:Type ComboBox}}">
継承定義しないとデフォルト=各OSの基本テーマが適用されてしまうので反映されません。
いやぁハマってしまった…。