古事連記帖

趣味のこと、技術的なこと、適当につらつら書きます。

Windowsストアアプリで外部アセンブリからResourceDictionaryを読みだす方法

XAMLで、自分オリジナルのUI作ったりするときとか、リストボックス等の表示方法変えたりするのにスタイルをいじったりしますが、それをまとめるResourceDictionaryがあります。
それをいろんなアプリで使いたいときに、いちいちxamlをコピーしてくるのもありですが、面倒だったり、ちゃんと管理できないと困るので、ライブラリ化してまとめておくと便利ですね


そうしてまとめたライブラリを使う方法は、いろんなブログではこんな感じで書かれていたりします。

<Page.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Controls;component/Style.xaml" /> <!-- これと、もしくは↓ -->
            <ResourceDictionary Source="pack://application:,,,/Controls;component/Style.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Page.Resources>

だったりしますが、WPFやWindows Phoneでは使えても、Windowsストアアプリ(WinRT)では「Failed to assign to property 'Windows.UI.Xaml.ResourceDictionary.Source'. [Line: * Position: *]」とか言われて無理だったりして、
WinRTではできないんじゃないか…と頭を抱えていましたが、Stack Overflowでしっかり書かれていました
API Only - Stack Exchange

<Page.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="ms-appx:///Controls/Style.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Page.Resources>

つまり、Sourceプロパティは "/Controls;component/Style.xaml"や "pack://application:,,,/Controls;component/Style.xaml" じゃなくて、
"ms-appx:///Controls/Style.xaml" と書きましょうってことですね。