WPFのC#コードビハインドでResourceDictionaryのリソースを取得する
WPF の ResourceDictionary は XAML 中から使用するには便利ですが、コードビハインド(C# のコード)から取得しようと思うと意外に面倒です。
今回はアイコンをディクショナリーに登録しておき、コードビハインドから読み込んでコントロールに表示したかったので、試行錯誤してできるようになりました。
ResourceDictionary
まず、こういう ResourceDictionary がプロジェクト内で定義されているとします(ファイル名は Icon.xaml)。この ResourceDictionary はプロパティでビルドアクションを Resource にしておきます。
1 2 3 4 5 6 7 |
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Canvas x:Key="TestIcon" Height="20" Width="20"> ~省略~ </Canvas> </ResourceDictionary> |
コードビハインド
このときこの “TestIcon” という Canvas をコードビハインドから読み込みたい場合、下記のように記述します。
1 2 3 4 5 |
Uri uri = new Uri("ABC.DEF.XXX;component/Icon.xaml", UriKind.Relative); StreamResourceInfo info = Application.GetResourceStream(uri); XamlReader reader = new XamlReader(); var dictionary = reader.LoadAsync(info.Stream) as ResourceDictionary; var element = dictionary["TestIcon"] as UIElement; |
まず、XAML ファイルの位置を示す Uri を指定します。このときアセンブリー名(ここでは ABC.DEF.XXX)が必要です。アセンブリー名は通常はプロジェクト名だと思いますが、任意のものに変更している場合はそれを指定します。なお、”dll” や “exe” はいりません。
これが間違っていると
1 |
IOException -> リソース '~.xaml' を検索できません。 |
と怒られます。
また、UriKind.Relative は相対 URI であることを明示するもので、これも書いていないと
1 |
UriFormatException -> 無効な URI: URI の形式を決定できませんでした。 |
と怒られます。
次に XamlReader に渡すため、StreamResourceInfo でリソースファイルの Stream を取得します。そのストリームを、XamlReader の LoadAsync に渡してやっとこさ ResourceDictionary が取得できます。
ResourceDictionary はディクショナリーなので(当たり前)、インデクサーにキーを指定してやればオブジェクトが取得できます。
最後までお読みいただきありがとうございました m(_ _)m