Используйте словарь ресурсов в качестве темы в Silverlight - PullRequest
7 голосов
/ 11 июня 2010

Я разработал приложение, которое позволяет пользователю переключаться между темами. Я делаю это путем включения файла xaml в качестве ресурса в мой проект и использования следующего кода:

MainTheme.ThemeUri = new Uri("SilverlightApplication1;component/Themes/[ThemeName]/Theme.xaml", UriKind.Relative);

Это работало хорошо, пока я не нашел следующие темы: http://timheuer.com/blog/archive/2010/05/17/silverlight-4-tools-released-and-new-application-templates.aspx

Разница в том, что эти темы состоят из нескольких файлов. Поэтому я создал файл Theme.xaml, который включает в себя только MergedDictionaries, так что я все еще мог использовать приведенный выше код. Это файл Theme.xaml для темы Cosmopolitan.

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="CoreStyles.xaml"/>
        <ResourceDictionary Source="SDKStyles.xaml"/>
        <ResourceDictionary Source="Styles.xaml"/>
        <ResourceDictionary Source="ToolkitStyles.xaml"/>
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

Однако, когда я запускаю код c # выше, я получаю следующее исключение:

System.Windows.Markup.XamlParseException: Failed to assign to property 'System.Windows.ResourceDictionary.Source'.

Просто чтобы прояснить, использование метода MergedDictionaries работает, когда я установил его в своем App.xaml:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Themes/Cosmopolitan/Theme.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

Что я делаю не так?

Спасибо!

1 Ответ

10 голосов
/ 23 августа 2010

Когда вы используете MergedDictionary, вы должны использовать полное имя, как показано ниже.

<ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/SilverlightApplication1;component/Themes/Cosmopolitan/Theme.xaml"/>

Также обратите внимание, что вы не должны пропустить косую черту перед названием сборки. Другими словами, это должно быть похоже на

Source="/SilverlightApplication1;

не как

Source="SilverlightApplication1;

НТН

...