Silverlight中的不同XAP文件 - 共享上下文

时间:2012-01-05 16:51:05

标签: 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();

        }
    }

(在我将它们分成单独的xap之前,所有这些UI都正常工作。我们有充分的理由将它们分开)

非常感谢任何帮助

更新

我尝试了示例link,并且能够从单独的xap文件启动第二个UI,其中包含数据库中的所有信息。

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

1)部分'xapfile2.Views.MyView'上的不可重组导入'xapfile2.Views.ViewModel(ContractName =“MyViewModel”)'阻止了导出的变化。有什么想法?。

由于 ķ

3 个答案:

答案 0 :(得分:1)

您应该使用框架来引入XAP文件。你正在重新发明轮子。

我的建议是使用MEF,这是一个由Microsoft创建的框架,可以完全按照您的要求创建。

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

请参阅此示例:http://codebetter.com/glennblock/2010/03/08/building-hello-mef-part-iv-deploymentcatalog/

祝你好运!

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

谢谢你的提示

ķ