Библиотека скинов WPF, которая работает в Visual Studio 2008 Designer - PullRequest
3 голосов
/ 02 сентября 2010

В наших проектах у нас есть представления и элементы управления, которые находятся во многих различных сборках (более 40 сборок в одном решении с сотнями просмотров).Мы хотели бы применить обложку ко всем представлениям из одной сборки обложки, которую мы можем заменить другой сборкой обложки, чтобы применить другую обложку (не обязательно во время выполнения, это можно сделать во время компиляции), и нужно только изменитьнесколько строк кода.А вот и кикер ... мы хотим, чтобы он правильно отображался в Visual Studio 2008 Designer.

В настоящее время у нас есть решение для выполнения скинов, которое применяет правильный скин путем слияния словаря основных ресурсов скина вApplication.Resources, но дизайнер визуальной студии не показывает эту обложку для представлений в сборках зависимостей.

Мы можем объединить словарь ресурсов обложки с каждым отдельным представлением Window.Resources, но это снижение производительности итребует много изменений, если мы хотим поменять скин.

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

Другие идеи?

1 Ответ

3 голосов
/ 15 марта 2011

Вы можете использовать прикрепленное поведение для объединения словаря ресурсов со всеми ресурсами окна / страницы / usercontrol, например:

<Page my:Skinlibrary.Attach="True">
   <!-- stuff goes here -->
</Page>

Вы можете настроить присоединенное поведение так, чтобы всегда объединять один и тот же экземпляр словаря ресурсов с ресурсами вложенного элемента. Для этого вам нужно только один раз инициализировать словарь ресурсов, возможно, в статическом ctor.

Предполагая, что у вас есть готовые ресурсы в переменной с именем _staticResourceDictionaryThatHoldsMySkin, а затем в обратном вызове PropertyChanged присоединенного свойства, вы можете сделать это, чтобы объединить его с присоединенными окнами:

static void OnAttachChanged(DependencyProperty sender, DependencyPropertyChangedEventArgs e)
{
   (sender as FrameworkElement).Resources.MergedDictionaries.Add(_staticResourceDictionaryThatHoldsMySkinResources);
}

Это позволит вам изменить скин во время компиляции, просто изменив файл SkinLibrary. Вы также можете загрузить словарь ресурсов, предварительно проверив файл конфигурации.

По моему опыту, оболочка будет правильно отображаться в дизайнерах Visual Studio как в 2008, так и в 2010 году.

...