gpt4 book ai didi

silverlight-4.0 - MEF + SL4问题

转载 作者:行者123 更新时间:2023-12-04 17:13:12 26 4
gpt4 key购买 nike

我正在Silverlight 4 RC中开发一个应用程序,并借此机会学习MEF处理插件控件。我已经在一个基本的庄园中使用了它,但是它并不是很整洁,而且我知道导入多个xap的更好的方法。

本质上,在我的主机应用程序的App.xaml中,我得到以下内容告诉MEF加载我的xap:

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; }


同样,这可行,但是我敢肯定我使用的是ImportMany错误...。

最后,MainPage.xaml.cs文件实现了IPartImportsSatisfiedNotification,我具有以下用于处理插件一旦加载的情况:

public void OnImportsSatisfied()
{
sp.Children.Clear();

foreach (IPlugInApp plugIn in PlugIns)
{
if (plugIn != null)
sp.Children.Add(plugIn.GetUserControl());
}
}


这行得通,但是运行n次似乎很脏(n是要加载的xap的数量)。我必须调用sp.Children.Clear()就像我没有那样,在加载2个插件时,我的堆栈面板填充如下:

测试插件A
测试插件A
测试插件B

我显然在这里错过了一些东西。谁能指出我应该做什么?
谢谢!

最佳答案

我认为您所做的大多数事情都很好。尽管ObservableCollections确实支持添加和删除各个元素的通知,但MEF并未利用这一点。在您的情况下,它将仅清除集合,然后添加所有插件。由于您将OnImportsSatisfied用于更改通知,因此您甚至不需要ObservableCollection。您可以只使用IEnumerable进行导入。

为了增加下载不同xap的灵活性,我将在您的容器中公开一个服务,该服务可以导入,并提供在给定URL的情况下下载xap的功能。然后,容器中的任何组件都可以触发下载,并且下载的URL可以来自您认为合适的任何来源。

关于silverlight-4.0 - MEF + SL4问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2463627/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com