Silverlight加载外部XAP包和页面

前言:在做一个系统时,我们往往或把系统模块化,不同业务分不同的模块,模块之间互不联系,独立化,方面维护和扩展。

在做一个Silverlight时,可以把Silverlight应用程序当成是一个模块,一个解决方案中拆分多个Silverlight,一个Silverlight就是一个一个XAP包,XAP包下面有各个具体页面。

当调用某个模块式,加载这个XAP包,以及某个界面,就可以运行改业务操作。

1:解决方案如下:

其中:SilverlightApplication2为主程序,界面如下

2:当点击点开按钮时,动态加载Demo的一个页面

点击按钮代码如下

  private void addxap_Click(object sender, RoutedEventArgs e)
        {

            //1 •使用WebClient下载SLRandarHitTest.xap文件,进行异步读取。
            WebClient Appclient = new WebClient();
            Appclient.OpenReadAsync(new Uri("Demo.xap", UriKind.Relative));
            Appclient.OpenReadCompleted += new OpenReadCompletedEventHandler(Appclient_OpenReadCompleted);
        }

        void Appclient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {
            CreateXAPResource("Demo.dll", "Demo.MainPage", e.Result);
        }


        /// <summary>
        /// 创建XAP包的反射实例并且加装到Canvas中
        /// </summary>
        /// <param name="dllStr">XAP包中的编译完成的运行代码的DLL文件</param>
        /// <param name="mainStr">需要实例化的启动页面</param>
        /// <param name="resultStream">使用WebClient下载到的数据流</param>
        private void CreateXAPResource(string dllStr, string mainStr, Stream resultStream)
        {
            //2 •
            //3 •获取其他包提供的资源流信息
            StreamResourceInfo streamResourceInfo = Application.GetResourceStream(new StreamResourceInfo(resultStream as Stream, null), new Uri(dllStr, UriKind.RelativeOrAbsolute));
            //4 •对Stream进行反射
            AssemblyPart assemblyPart = new AssemblyPart();
            Assembly assembly = assemblyPart.Load(streamResourceInfo.Stream);
            //5 •(创建实例
            var uc = (UserControl)assembly.CreateInstance(mainStr);
            //主界面的容器
lRoot.Children.Clear(); lRoot.Children.Add(uc); }

 3:最后看运行效果

posted on 2013-05-21 22:05  梦想飞的鱼  阅读(294)  评论(0编辑  收藏  举报

导航