Q115. ソリューション全体でアイコンを統一管理したい
A.ソリューション全体で画面のアイコンを統一管理したいというニーズがあったため、この記事を起こしました。
まず単一の画面であれば、以下のようにWindow.Icon プロパティにパスを指定するだけで事足ります。
<Window Icon="/hoge.ico" />
少し大きなプロジェクトになると、アイコンファイル等のリソースを管理するフォルダをプロジェクトに設け、Icon プロパティは パッケージ URI で指定するようにした方が管理し易くなります。以下はパッケージ URIで指定した例になります。
<!-- アプリケーション実行アセンブリを基準とした、Resources フォルダ内アイコンファイルのパッケージ URI 例--> <Window Icon="pack://application:,,,/Resources/hoge.ico" />
ちなみにパッケージURI については以下の記事を参考にさせていただきました。
参考記事:WPF におけるパッケージの URI
参考記事:WPF 上の pack URI
このパッケージ URI はソリューション内のどのプロジェクトからも有効ですが、二つ問題が考えられます。
まず一つ目は、下位のプロジェクトだと XAML デザイナでエラーが発生することです。参照される側のプロジェクトでは、実行アセンブリ内に存在するアイコンファイルをデザイン時に参照できないため、エラー一覧に「リソース 'resources/hoge.ico' を検索できません」というエラーが表示されてしまいます。エラーが出ても一応デザイナで編集は行えますが、あまり気持ちのいいものではありません。
もう一つは、参照されるプロジェクト側で URI を指定するのはどうよ、という問題。アイコンファイルの名前が変わったら、アイコンを使うすべての画面の XAML を書き換えなければなりません。
そこで Application.xaml で BitmapImage のリソースを定義し、画面のアイコンにリソースを指定するようにします。
<Application x:Class="Application" ・・・・・・ Startup="Application_Startup"> <Application.Resources> <BitmapImage x:Key="windowIcon" UriSource="pack://application:,,,/Resources/hoge.ico" /> </Application.Resources> </Application>
これでウィンドウの XAML はリソースを参照すればいいだけになります。下位プロジェクトのデザイナでもエラーは発生しなくなりました。
<Window Icon="{StaticResource windowIcon}" />