2014-02-12 4 views
1

У меня возникли проблемы с общими стилями между различными проектами. Вот мои проекты: -Задание стилей в библиотеке управления пользователями WPF

  • «Common» - библиотека классов, содержащая общие стили WPF.
  • «Плагин» - библиотека классов, содержащая пользовательский элемент управления (не пользовательский элемент управления).
  • «Основное приложение» - основное приложение WPF, которое отображает пользовательский элемент управления, определенный в «Плагине».

«Обычное» и «Основное приложение» находятся в одном решении, а «Плагин» - в своем собственном решении.

Стили в «Основные приложения» работы над проектом штрафа - он ссылается на «общий» проект и имеет следующее App.xaml: -

<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="pack://application:,,,/Common;component/MyStyles.xaml" /> 
</ResourceDictionary.MergedDictionaries> 

При редактировании XAML файлы в проекте «Core приложение» , Я получаю intellisense по именам стилей, не squiggly подчеркивает, и все отлично работает во время выполнения тоже.

Задача с проектом «Плагин». Я ссылался на сборку «Common» и создал файл \ Themes \ Generic.xaml, содержащий тот же слияние XAML, что и выше. Generic.xaml имеет встроенное действие «Страница», и я добавил следующий AssemblyInfo.cs: -

[assembly: ThemeInfo(ResourceDictionaryLocation.None, 
        ResourceDictionaryLocation.SourceAssembly)] 

Когда я отредактировать XAML из пользовательского элемента управления в этом проекте «Plugin», стили «Обычная» сборка не отображается в intellisense, а VS/Resharper помещает строчку под их именами. Я даже добавил стиль непосредственно к Generic.xaml, но UC тоже не может этого понять. Пользовательский элемент управления выглядит примерно так: -

<UserControl ..blah..> 
    <StackPanel> 
     <TextBlock Style="{StaticResource AStyleInCommonAssembly}" Text="Hello"/> 
     <TextBlock Style="{StaticResource AStyleInGenericXaml}" Text="World"/> 
    </StackPanel> 
</UserControl> 

Во время выполнения WPF делает правильно применять стили, которые находятся в «Общие» сборки (я предполагаю, что это найти их из словаря сливаются в App.xaml) , Однако он все еще не может найти стиль, который я добавил непосредственно в Generic.xaml.

Что мне не хватает? Этот подход работает только с пользовательскими элементами управления, а не с пользовательскими элементами управления, с которыми я имею дело? Мой приоритет - заставить все работать во время выполнения, но получение опыта разработки/времени/intellisense будет бонусом.

ответ

4

Решено. Похоже, что метод использования generic.xaml применяется только к пользовательским элементам управления, а не к пользовательским элементам управления. Стили, определенные в generic.xaml (напрямую или объединенные из другой сборки), недоступны для пользовательских элементов управления.

Поняв это, я просто вернулся к слиянию внешнего словаря сборки ресурсов внутри самого элемента управления пользователя, а именно:

<UserControl.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="pack://application:,,,/Common;component/MyStyles.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</UserControl.Resources> 

Не идеал того, чтобы сделать это в каждом UC, но я могу жить с этим в моем сценарии, поскольку у меня будет только один или два в этих проектах «плагинов».

При этом я обнаружил еще одну проблему, и следующее может помочь кому-то в будущем.Файл MyStyles.xaml в моей «общей» сборке не содержит собственных стилей - он просто объединяет ряд других ресурсных словарей в этой сборке. Это было сделано для удобства, а это означало, что потребителю необходимо было объединиться в MyStyles.xaml, а не в дюжину отдельных XAML в этой сборке.

Получается, что в WPF есть ошибка, при которой «вложенные» объединенные словари не обрабатываются правильно. Я обнаружил, что если я положу стиль непосредственно в MyStyles.xaml, пользовательский элемент управления найдет его. Однако он отказывается распознавать любые стили в словарях, с которыми сливается MyStyles.xaml! Я теперь сбросил MyStyles.xaml и вернулся к объединению в отдельных словарях (изнутри пользовательского элемента управления XAML) - все работает, во время разработки и времени исполнения.

Смежные вопросы