Silverlight MEF - импорт ресурсов и помещение в generic.xmal - PullRequest
0 голосов
/ 22 января 2012

У меня есть приложение silverlight с файлом generic.xaml. В общем файле я хотел бы объединить словари, которые импортируются MEF из других библиотек DLL.

Как я могу это сделать? (пример был бы неплох)

Ответы [ 2 ]

0 голосов
/ 23 января 2012

я использую следующее:

экспорт моего ресурса с помощью mef (просто добавьте файл .cs в ваш Resourcedictionary)

[ExportResourceDictionary]
public partial class MyResourcen : ResourceDictionary
{
    public MyResourcen()
    {
        InitializeComponent();
    }
}

добавление нового файла класса в ваш xaml

<ResourceDictionary x:Class="Test.Resourcen.MyResourcen">

импортируйте ресурсы, где вы хотите, например, app.xaml

[ImportMany("Resourcen", typeof(ResourceDictionary), AllowRecomposition = true)]
private IEnumerable<ResourceDictionary> ImportResourcen { get; set; }

    #region Implementation of IPartImportsSatisfiedNotification

    public void OnImportsSatisfied()
    {
        foreach (var dic in ImportResourcen)
        {
            this.Resources.MergedDictionaries.Add(dic);
        }
    }

    #endregion

, по крайней мере, вот атрибут exportat

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class ExportResourceDictionaryAttribute : ExportAttribute
{
    public ExportResourceDictionaryAttribute() : base("Resourcen", typeof(ResourceDictionary))
    {

    }
}
0 голосов
/ 22 января 2012

Я делаю это, когда загружается один конкретный модуль, и он работает хорошо.

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

 addResourceDictionaries();



 protected void addResourceDictionaries()
    {
        LoadResource ( new Uri("/NAME_OF_DLL;component/assets/name_and_path_of_xaml.xaml", UriKind.Relative));
    }

private void LoadResource(Uri uri)
    {
        var info = System.Windows.Application.GetResourceStream(uri);
        string xaml;
        using (var reader = new System.IO.StreamReader(info.Stream))
        {
            xaml = reader.ReadToEnd();
        }

        ResourceDictionary result = System.Windows.Markup.XamlReader.Load(xaml) as ResourceDictionary;

        if (result != null)
        {
            System.Windows.Application.Current.Resources.MergedDictionaries.Add(result);
        }
    }
...