2012-01-05 32 views
0

我有一个silverlight应用程序,我最近将它们分解为单独的xap文件。Silverlight中的不同XAP文件 - 共享上下文

意向是这样的。有一个xap文件1,它将用户的一些输入保存到数据库中。当用户单击此UI上的按钮(从xap文件1)时,它将加载xap文件2,该文件要求输入更多并将其保存到数据库。

我能够从xap文件1中调用xap文件2,但UI似乎无法从数据库中获取信息(UI显示的是之前UI保存的内容),也不是能够坚持用户的输入。我意识到,xap文件2需要以某种方式告诉在何处以及如何坚持。

这是我如何加载XAP文件2

 WebClient wc = new WebClient(); 
     wc.OpenReadCompleted += new OpenReadCompletedEventHandler(OpenReadCompleted); 
     Uri uri = new Uri("xapfile2.xap", UriKind.Relative); 
     wc.OpenReadAsync(uri); 


private void OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
    { 
     Uri uri = new Uri("xapfile2.dll", UriKind.Relative); 

     StreamResourceInfo resource_stream = App.GetResourceStream(new StreamResourceInfo(e.Result, null), uri); 

     AssemblyPart part = new AssemblyPart(); 
     Assembly assembly = part.Load(resource_stream.Stream); 
     UIElement control = assembly.CreateInstance("xapfile2.Window") as UIElement; 
     if (control != null) 
     { 
      RadWindow window = (RadWindow)control; 
      window.ShowDialog(); 

     } 
    } 

(所有这些UI的是工作之前,我把它们分成不同的XAP的。我们有充分的理由分裂他们)

任何帮助将不胜感激

UPDATE

我尝试以下的例子link,并能够从单独的xap文件中使用数据库中的所有信息启动第二个UI。

现在我似乎遇到了新的问题。当我在第二个UI上取消时,是否必须从目录中卸载第二个xap调用removeXap?当我这样做,我得到组成保持不变的错误。

1)部分'xapfile2.Views.MyView'上的不可重新导入'xapfile2.Views.ViewModel(ContractName =“MyViewModel”)'阻止了出口更改。有任何想法吗?。

感谢 ķ

+0

你有没有使用棱镜来加载你的XAP文件模块,你认为?这可能有帮助。 – 2012-01-05 19:21:12

+0

新问题应该是一个新问题。其他人可能会遇到同样的问题,或者会遇到同样的问题并想要搜索。 – foson 2012-01-09 13:40:53

回答

1

您应该使用一个框架,你的XAP文件带来。你正在重新发明轮子。

我的建议是使用MEF,由Microsoft创建的框架来完成您正在创建的内容。

MEF有一个部署目录的概念,它下载xap文件并加载它们。然后,使用接口和契约等模式,您可以创建对象,在屏幕上显示它们并接受更多输入。

见这个例子:http://codebetter.com/glennblock/2010/03/08/building-hello-mef-part-iv-deploymentcatalog/

祝您好运!

+0

我尝试了下面的例子[link](http://codebetter.com/glennblock/2010/03/08/building-hello-mef-part-iv-deploymentcatalog/),并能够从单独的版本启动第二个UI包含来自数据库的所有信息的xap文件。现在我似乎遇到了一个新问题。当我在第二个UI上取消时,是否必须从目录中卸载第二个xap调用removeXap? – 2012-01-08 22:12:01

+0

嗨耶利米,谢谢你的回答。 – 2012-12-05 07:35:39

0

具有独立的XAP文件不会创建任何边界 - 当加载第2个XAP时,其类型将加载到相同的AppDomain中。看起来你需要在你的Xap1和Xap2的类之间使用某种常见的消息总线。您可以使用事件聚合器。许多框架都有一个,或者你可以使用你自己的 - 在xap的两个引用的dll中构建它(和自定义事件类型)。 我想我已经使用了http://www.keith-woods.com/Blog/post/Rx-Event-Aggregator.aspx

+0

请参阅我的更新,感谢您的推荐。 – 2012-01-08 22:19:24

0

经过很多努力,我发现我在xap文件中有冗余程序集。显然,程序集中不应该有冲突。在第二个xap所需的程序集上设置CopyLocal = False似乎解决了这个问题。

谢谢你们为你的秘诀

ķ