Изменение / добавление словаря ресурсов в коде позади, пожалуйста, помогите - PullRequest
1 голос
/ 27 февраля 2011

В настоящее время я занимаюсь разработкой приложения Silverlight, и я все еще начинаю с этим. Мне интересно, если есть возможность изменить источник словаря ресурсов в коде позади (C #) в App.xaml? Я попробовал код ниже, но получить исключение, я получаю имя папки стиля из службы WCF, переменная называется Style (она содержит имя папки)

ResourceDictionary rDictionary = this.Resources.MergedDictionaries[0];
        rDictionary.Source = new Uri(string.Format("Resources/Styles/{0}/Styles.xaml", style), UriKind.Relative);
        this.Resources.MergedDictionaries.Add(rDictionary);

Я получаю ошибку в

rDictionary.Source = new Uri(string.Format("Resources/{0}/Styles.xaml", "Default"), UriKind.RelativeOrAbsolute);

Что читает

System.Exception: Error HRESULT E_FAIL has been returned from a call to a COM component.
   at MS.Internal.XcpImports.CheckHResult(UInt32 hr)
   at MS.Internal.XcpImports.SetValue(IManagedPeerBase obj, DependencyProperty property, String s)
   at MS.Internal.XcpImports.SetValue(IManagedPeerBase doh, DependencyProperty property, Object obj)
   at System.Windows.DependencyObject.SetObjectValueToCore(DependencyProperty dp, Object value)
   at System.Windows.DependencyObject.SetEffectiveValue(DependencyProperty property, EffectiveValueEntry& newEntry, Object newValue)
   at System.Windows.DependencyObject.UpdateEffectiveValue(DependencyProperty property, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, ValueOperation operation)
   at System.Windows.DependencyObject.SetValueInternal(DependencyProperty dp, Object value, Boolean allowReadOnlySet)
   at System.Windows.ResourceDictionary.set_Source(Uri value)
   at FCStarFish.App..ctor()

Ответы [ 3 ]

4 голосов
/ 23 августа 2011

Работает ли это

<Application.Resources>
    <ResourceDictionary x:Key="resourcestyles">
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary /> <!-- Dummy, this is the one we will replace -->
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>

Затем мы помещаем ResourceDictionary в [0] (где наш фиктивный ResourceDictionary).

Загрузка или замена словаря стилей(загрузите его со стилем по умолчанию в Application_Startup в app.xaml.cs)

var rDictionary = new ResourceDictionary();
rDictionary.Source = new Uri(string.Format("/MyApp;component/Resources/Styles/{0}/Styles.xaml", style), UriKind.Relative);
this.Resources.MergedDictionaries[0] = rDictionary;

Замените MyApp именем вашего приложения.

1 голос
/ 01 апреля 2011

Сначала выполните шаги, упомянутые NateTheGreat ниже, и добавьте к своему UriStirng "/"Это должно выглядеть так:

ResourceDictionary rDictionary = this.Resources.MergedDictionaries[0];
        rDictionary.Source = new Uri(string.Format("/Resources/Styles/{0}/Styles.xaml", style), UriKind.Relative);
        this.Resources.MergedDictionaries.Add(rDictionary);
0 голосов
/ 23 марта 2011

Я только что столкнулся с этой проблемой. В моем случае решение состояло в том, чтобы изменить действие сборки XAML-файла словаря ресурсов на «Содержимое», «Копировать в выходной каталог» на «Копировать, если новее», а пользовательский инструмент - на пустую строку. Значения по умолчанию были установлены на Page / Do not copy / MSBuild: Compile, соответственно.

...