Как получить изменение в ресурсах для распространения по всему приложению, в том числе в ValueConverters? - PullRequest
0 голосов
/ 12 июня 2009

У меня есть приложение, которое позволяет пользователю изменять цветовые схемы на основе внешнего файла xaml. Когда пользователь нажимает на MenuItem, который содержит название темы, выполняется следующий код:

MenuItem mi = sender as MenuItem;
string executingDirectory = Assembly.GetExecutingAssembly().Location.Substring(0, Assembly.GetExecutingAssembly().Location.LastIndexOf("\\"));
string path = System.IO.Path.Combine(executingDirectory + "\\Themes", mi.Header.ToString() + ".xaml");

if (File.Exists(path))
{
    using (FileStream fs = new FileStream(path, FileMode.Open))
    {
        ResourceDictionary dic = (ResourceDictionary)XamlReader.Load(fs);
        Resources.MergedDictionaries.Clear();
        Resources.MergedDictionaries.Add(dic);
    }
}

Это работает для большинства приложений - меняются все мои ресурсные кисти - с одним исключением. У меня есть субконтроль, цвет фона которого определяется привязкой значения с помощью конвертера. Однако вместо того, чтобы жестко кодировать цвета в конвертере, конвертер использовал строковые константы для имен кистей, а затем возвращал цвет из App.Current.Resources:

Brush ret = Application.Current.Resources[brushToReturn] as Brush;

То, что здесь происходит, заключается в том, что Application.Current.Resources не содержит тот же набор ресурсов, что и окно. Я попытался загрузить тему в Application.Current.Resources и прочитать ее в конвертере, но, похоже, это тоже не работает. Кто-нибудь может сказать мне, что мне здесь не хватает? Есть ли способ изменить, скажем, Application.Current.Resources и повлиять ли он на открытые окна?

Спасибо!

1 Ответ

0 голосов
/ 12 июня 2009

Трудно сказать, не видя весь ваш код, но проверка свойства Resources не проверяет автоматически объединенные словари. Кроме того, если вы объединяете ресурсы темы на уровне Window, они вообще не будут на уровне приложения. Для согласованности лучше всего, если бы ваш конвертер держал элемент, для которого он конвертировал, и использовал FindResource:

var frameworkElement = values[0] as FrameworkElement;
var resource = frameworkElement.FindResource("SomeKey") as Brush;

Использование IMultiValueConverter может быть вашим лучшим вариантом. В качестве альтернативы, если это слишком запутанно, вы можете заняться написанием расширения разметки, которое делает то, что вам нужно.

...