2012-05-10 4 views
5

У меня есть компонент импорта MEF, который динамически загружается при открытии мастера импорта. Как только пользователь выбирает тип импорта, который она хочет обработать, управление диалоговым окном мастера импорта передается выбранному компоненту импорта. Конечно, компоненты импорта должны поставлять ресурсы в диалоговое окно мастера (например, DataTemplate). На данный момент это реализовано через DataTemplateSelector s, которые предоставляются компонентами импорта. Они получают доступ к локальному ResourceDictionary сборки компонента импорта.Как предоставить ресурсы XAML из компонентов MEF

Но, как вы можете себе представить, что это утомительно: Я должен добавить код для каждого DataTemplate, чтобы обеспечить, WPF автоматически не использовать право DataTemplate по типу ViewModel отображается.

Неужели кто-нибудь решил эту проблему раньше? Как вы, ребята, предоставляете ресурсы в подключаемой среде?

Благодарим за любую помощь заранее.

С наилучшими пожеланиями

ответ

13

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

В каждой сборке с ресурсами, экспортировать один или несколько ResourceDictionary объектов, идя код позади и аннотирования, как это:

[Export(typeof(ResourceDictionary))] 
public partial class Resources : ResourceDictionary 
{ 
    public Resources() 
    { 
     InitializeComponent(); 
    } 
} 

Теперь вам нужен компонент, который устраняет [ImportMany] IEnumerable<ResourceDictionary> resourceDictionaries и сделать что-то вроде этого:

 //Merge exported resource dictionaries from all composed sources into the application 
     foreach (var resourceDictionary in resourceDictionaries) 
     { 
      Application.Current.Resources.MergedDictionaries.Add(resourceDictionary); 
     } 
+0

Я в основном дал эту идею попробовать. Я поддержал свой «ResourceDictionary» с помощью файла класса, таким образом, мог бы легко его создать. Страница мастера теперь может объединить этот словарь, чтобы «импортировать» его ресурсы. Большое спасибо. – oddparity

+0

Общая идея иметь код для ресурсного словаря для меня совершенно новая ... это открывает целый мир возможностей, приятный. – grek40

0

Если импортированный компонент будет содержаться только в определенной области вашего приложения, то вы можете добавить только DataTemplate для корневой ViewModel компонента к ресурсам FrameworkElement, который представляет собой область, где компонент будет быть расположенным. Все остальные DataTemplates (для других ViewModels в импортированном компоненте) затем будут содержаться в Ресурсах DataTemplate для корневого ViewModel компонента.

+0

Это означает, что я объявляю 'DataTemplate' для корня' ViewModel компонента 'в основной программе, не так ли? Я хотел бы иметь эти «детали реализации» компонента, расположенного в сборке компонента. – oddparity

+0

Нет. Я думал, что FrameworkElement, представляющий область, в которой будет находиться компонент, будет передан в код компонента в качестве параметра. Объявление DataTemplate для корневого ViewModel компонента в основной программе не имело бы смысла, поскольку оно не создавало бы приложения. – Stipo

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