На самом деле вы спрашиваете, каков наилучший подход к разделению приложения WPF на несколько сборок. Ваша стратегия состоит в том, чтобы создавать повторно используемые библиотеки управления и позволить приложению интегрировать все. Отлично, пока. Последний вопрос, который вам нужно решить, это ресурсы. Чтобы справиться с этим, вам нужно добавить Themes\Generic.xaml
и переместить в него все ресурсы вашей библиотеки. Затем библиотека может найти все необходимые ресурсы, и приложение может переопределить ее, если пожелает.
Вот хорошая статья, в которой обсуждаются некоторые проблемы, связанные с ресурсами в нескольких сборках:
Также убедитесь, что вы настроили атрибуты сборки элемента управления так, чтобы Generic.xaml
находился в поиске:
[assembly: ThemeInfo(
ResourceDictionaryLocation.None,
ResourceDictionaryLocation.SourceAssembly)]
Edit:
Приведенное выше решение относится к пользовательским элементам управления, а не к UserControl
ресурсам. Для обработки ресурсов UserControl
в отдельной сборке, которую основное приложение может переопределить, вы можете использовать этот подход:
- Используйте
{DynamicResource ...}
и просто оставьте определение ресурса вне UserControl
.
Проблема в том, что хотя ресурс будет правильно расположен во время выполнения, он не будет найден во время разработки, и это может сделать вашу UserControl
очень сложной для работы. Существует два способа решения этой проблемы:
- Используйте Expression Blend вместе с его функцией «Ресурсы времени проектирования». Простое открытие проекта с ресурсами, которые не могут быть разрешены, заставит Blend запросить, какие ресурсы использовать во время разработки.
- Используйте Visual Studio для разработки
UserControl
и включите ресурсы времени разработки в сам XAML.
Для Visual Studio вы можете включить это в UserControl
, проектируя только :
<UserControl.Resources>
<ResourceDictionary Source="/YourControlLibrary;component/DesignTimeResources.xaml"/>
</UserControl.Resources>
Как только вы закончите разработку, просто закомментируйте этот код в XAML. Это неудобно, но пока Visual Studio не поддерживает ресурсы времени проектирования, по крайней мере, это работает.