2012-01-05 40 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似乎解決了這個問題。

謝謝你們爲你的祕訣

ķ