如何使用MEF将我的项目划分为更小的xap并即时下载?

时间:2011-07-15 20:42:27

标签: c# .net silverlight prism mef

现在,我的XAP文件变得很大,我需要一个解决方案来将其分区为一些较小的应用程序。 MEF或PRISM可能会解决我的问题

我阅读并观看了他们的在线教程,但仍然不知道如何将它们应用到我当前的项目中。

让我解释一下我的项目:

- 在mainpage.xaml中,它只有一个menucontrol。但是,该菜单控件将基于通过服务调用检索的数据进行动态构建。你可以在我的菜单图片上看到

http://www.flickr.com/photos/31396433@N08/sets/72157627077751863/

- 每当用户点击menuItem时,将弹出该menuItem的窗口,让用户开展业务。您可以在我的GeneralLedger_JournalPosting图片上看到。 journalPosting menuItem属于GeneralLedger部分。

http://www.flickr.com/photos/31396433@N08/sets/72157627077751863/

这是显示如何通过menuControl上的menuItem的click事件显示弹出menuItem窗口的代码

private void MenuItemClick(object sender, RadRoutedEventArgs args)
    {
        RadMenuItem item = args.OriginalSource as RadMenuItem;
        SFMenu sFMenu = item.Header as SFMenu;
        OpenMenuItemScreenBy(sFMenu.Name);

    }   

    private void OpenMenuItemScreenBy(string menuName)
    {
        if (menuName == "User Management")
        {
            var userManagement = new UserManagement();
            //userManagement.WindowStartupLocation = WindowStartupLocation.Manual;
            userManagement.Top = 50;

            userManagement.Show();
        }
        //Testing area
        else if (menuName == "Testing")
        {
            Testing t = new Testing();
            t.Top = 50;
            t.Show();
        }
        //
        ......
        .......

这就是我的项目。基本上,我只需要为每个menuItem创建不同的屏幕。因为我的menuItems的数量继续增加所以应该创建更多相应的窗口屏幕。这使我的XAP变得更大。

解决方案:

我正在考虑将每个Window MenuItem屏幕(例如GeneralLedger_JournalPosting)分隔成单独的XAP。我的主XAP文件只包含menuControl。

但是,如果用户单击menuItem(例如GeneralLedger / JournalPosting),我需要知道如何动态加载相应的menuItem XAP文件。并打开JournalPosting屏幕

但是如果用户再次点击该menuItem,则无需下载。只需查看缓存

即可

(我观看MEF教程并知道我需要使用DeloymentCatalog来获取该功能。但是,我没有看到任何让我们通过代码手动访问动态XAP文件中的usercontrol的示例)

其次,

因为我的每个menuItem窗口屏幕都会使用相同的第三方dll(例如:用于GridView的dll,导航,...)。所以你也可以告诉我如何让我只下载那些dll一次。因为如果我将这些dll放入我的menuItem窗口屏幕XAP中,那么我认为每次相应的XAP请求下载时它们都会被重载

谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

看看这里:http://www.codeproject.com/KB/silverlight/MEFDynamicLoading.aspx。该项目描述了如何按需加载xap并在下载后显示它们。

有趣的部分是MainPageModel.cs。有加载xap并将内容放入面板。所以如果你要求DeploymentCatalogService为“AddXap”并且它已经加载=>调用回调或发起事件。

关于dll的。您必须将它们放在MainApp中。在您下载的应用程序中,您必须将MainApp定义的dll设置为CopyLocal = false(可在dll的属性中找到(参考文献))

我希望这有帮助!

BR,

TJ