0

我有一个 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 都可以正常工作。我们有充分的理由将它们拆分)

任何帮助将不胜感激

更新

我尝试按照示例链接进行操作,并且能够从单独的 xap 文件中启动第二个 UI,其中包含数据库中的所有信息。

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

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

谢谢K

4

3 回答 3

1

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

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

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

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

祝你好运!

于 2012-01-06T19:52:31.423 回答
0

拥有单独的 XAP 文件不会创建任何边界——当第二个 XAP 被加载时,它的类型被加载到同一个 AppDomain 中。似乎您需要 Xap1 和 Xap2 中的类之间的某种通用消息总线。您可以使用事件聚合器。许多框架都有一个,或者您可以使用自己的——在两个 xap 引用的 dll 中构建它(和自定义事件类型)。我想我用过http://www.keith-woods.com/Blog/post/Rx-Event-Aggregator.aspx

于 2012-01-06T21:45:36.457 回答
0

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

谢谢你们的提示

ķ

于 2012-01-11T15:03:55.580 回答