Silverlight 4.0 MEF+;SL4问题
我正在Silverlight 4 RC中开发一个应用程序,并借此机会学习处理插件控件的MEF。我已经让它在一个相当基本的庄园工作,但它并不完全整洁,我知道有一个更好的方法导入多个xap 本质上,在我的主机应用程序App.xaml中,我有以下命令告诉我加载我的xap:Silverlight 4.0 MEF+;SL4问题,silverlight-4.0,mef,Silverlight 4.0,Mef,我正在Silverlight 4 RC中开发一个应用程序,并借此机会学习处理插件控件的MEF。我已经让它在一个相当基本的庄园工作,但它并不完全整洁,我知道有一个更好的方法导入多个xap 本质上,在我的主机应用程序App.xaml中,我有以下命令告诉我加载我的xap: AggregateCatalog catalog = new AggregateCatalog(); DeploymentCatalog c1 = new DeploymentCatalog(new Uri("TestPlugIn
AggregateCatalog catalog = new AggregateCatalog();
DeploymentCatalog c1 = new DeploymentCatalog(new Uri("TestPlugInA.xap", UriKind.Relative));
DeploymentCatalog c2 = new DeploymentCatalog(new Uri("TestPlugInB.xap", UriKind.Relative));
catalog.Catalogs.Add(c1);
catalog.Catalogs.Add(c2);
CompositionHost.Initialize(catalog);
c1.DownloadAsync();
c2.DownloadAsync();
我确信我在这里没有完全使用AggregateCatalog,我需要能够加载目录中可能存在的任何xap,而不仅仅是硬编码Uri
此外,在主机中的MainPage.xaml.cs中,我有以下集合,MEF将插件放入其中:
[ImportMany(AllowRecomposition = true)]
public ObservableCollection<IPlugInApp> PlugIns { get; set; }
这是可行的,但它运行n次(n是要加载的xap的数量)看起来很肮脏。我必须调用sp.Children.Clear(),就像我不调用一样。加载2个插件时,我的堆栈面板填充如下:
测试插件A
测试插件A
测试插件B
我显然遗漏了一些东西。有人能指出我应该做什么吗?
谢谢 我认为你现在做的大部分事情都很好。尽管ObservableCollections确实支持添加和删除单个元素的通知,但MEF并没有利用这一点。在您的情况下,它只需清除集合,然后添加所有插件。因为您使用的是OnImportsAssetized作为变更通知,所以您甚至不需要ObservableCollection。您可以使用IEnumerable进行导入
为了增加下载不同xap的灵活性,我将在您的容器中公开一个可以导入的服务,该服务提供在给定url的情况下下载xap的功能。然后,您容器中的任何组件都可以触发下载,并且要下载的url可以来自您认为合适的任何来源。谢谢,这正是我所做的,似乎适合我的需要
public void OnImportsSatisfied()
{
sp.Children.Clear();
foreach (IPlugInApp plugIn in PlugIns)
{
if (plugIn != null)
sp.Children.Add(plugIn.GetUserControl());
}
}