我有一个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”)'阻止了导出的变化。有什么想法?。
由于 ķ
答案 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似乎解决了这个问题。
谢谢你的提示
ķ