WPF / Prism: Как сделать так, чтобы ресурс моего основного приложения превращался в пользовательский элемент управления, содержащийся в отдельной сборке? - PullRequest
3 голосов
/ 08 января 2011

У меня есть следующее:

MainApp - Сборка 1 (Содержит UserContolA) - Сборка 2 (Содержит UserControlB) - и т. Д.

Хотя не каждая сборка будет загружена, поэтому

Ни одна сборка не может скомпилироваться, если я пытаюсь назначить ресурсы для элементов управления (кнопка, выпадающий список и т. Д.), Которые не могут быть найдены, потому что я хочу, чтобы мое MainApp определяло эти ресурсы. Но, если я включу ресурсы в сборки, мне кажется, что я не могу их переопределить (потому что WPF идет снизу вверх для ресурсов, отдавая приоритет тем, кто ближе к основанию).

Кроме того, я боюсь, что даже если я решу эту проблему, пытаясь придать ей динамический характер, чтобы пользователь мог выбирать из разных «тем», чтобы сделать ее еще более сложной.

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

1 Ответ

1 голос
/ 09 января 2011

На самом деле вы спрашиваете, каков наилучший подход к разделению приложения 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 не поддерживает ресурсы времени проектирования, по крайней мере, это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...