Небольшое руководство по собственному опыту по переносу ресурсов из Shell в совместную сборку и созданию отличной работы дизайнера
Некоторые мысли, основанные на прочтении таких вопросов и поиске в Интернете той же / подобной проблемы,Я пишу это в первую очередь из-за проблемы 2 (ниже), которая связана с этой проблемой, ИМХО.
Итак, у нас был одинаковый дизайн, все стили и ресурсы были в Shell.Это вызвало 2 проблемы:
- Контекстная справка в XAML-редакторе недоступна (<- ресурсы не найдены) </li>
- Конструктор не будет отображаться правильно (<- ресурсы не найдены)</li>
Таким образом, мы перенесли все стили в общую сборку (Ресурсы).
Чтобы решить первую проблему, вам понадобится что-то вроде предложенного Liero, то есть добавить словарь ресурсов в каждый UserControl.Я не пробовал его SharedDictionary, но обычный ResourceDictionary определенно возвращает контекстную справку и удаляет строки с синим подчеркиванием.Дизайнер, однако, все еще не показывался должным образом.
Итак, вторая проблема.Есть небольшая хитрость, чтобы привести стили к дизайнеру во время разработки, описанную только в этой статье .По сути, вы добавляете словарь ресурсов с именем DesignTimeResources.xaml в ваш проект, который содержит ссылку на ваши ресурсы:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/Resources;component/Themes/Generic.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
Чем переместить его в папку «Свойства».Затем отредактируйте вручную проектный файл и измените элемент для этого файла следующим образом:
<Page Include="Properties\DesignTimeResources.xaml" Condition="'$(DesignTime)'=='true' OR ('$(SolutionPath)'!='' AND Exists('$(SolutionPath)') AND '$(BuildingInsideVisualStudio)'!='true' AND '$(BuildingInsideExpressionBlend)'!='true')">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
<ContainsDesignTimeResources>true</ContainsDesignTimeResources>
</Page>
По сути, это файл, который Blend сгенерирует, если вы добавите ресурсы времени разработки.VS не может создать это, хотя может прочитать это просто отлично.Редактирование файла проекта говорит о том, что вы не хотите в основном этот файл в релизе.
Здесь также есть две незначительные ошибки, возможно, это кому-нибудь поможет.
- При переносе ресурсов из Shell в Resources наш проект Resources не будет работать со странными ошибками, из-за которых он не сможет найти элементы управления UserControls, на которые ссылаются файлы стилей (все проблемные элементы управления также были определены в проекте Resources).Они работали очень хорошо, когда ссылались из Shell прежде.Проблема заключалась в том, что некоторые инструменты (например, Resharper) автоматически ссылаются на эти элементы управления в пространстве имен, например "
clr-namespace:XXX;assembly=Resources
".";assembly=Resources
" - часть, которую вы должны удалить, поскольку теперь это та же самая сборка. Мы уже используем некоторые локальные ресурсы в наших пользовательских элементах управления, например:
<UserControl.Resources>
<PresentationHelpers:BoolToVisibilityConverter x:Key="boolToVisibilityConverter" />
</UserControl.Resources>
Итак, сначала я только добавил новый ResourceDictionary в этот блок, который попросил меня предоставить ключ x :.Я так привык добавлять ресурсы непосредственно в UserControl.Resources, что сначала не осознавал, что для объединения другого словаря вам понадобится тег <ResourceDictionary>
, который обычно можно пропустить.Так это будет выглядеть так:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<Helpers:RedbexResourceDictionary Source="pack://application:,,,/Resources;component/Themes/Generic.xaml" />
</ResourceDictionary.MergedDictionaries>
<PresentationHelpers:BoolToVisibilityConverter x:Key="boolToVisibilityConverter" />
</ResourceDictionary>
</UserControl.Resources>