2010-06-24 25 views
1

我知道可以在運行時解析一個XAML文件並創建一個UIElement,我可以將它插入到我的網頁中,這裏沒有問題。WPF:在運行時替換頁面或usercontrol的XAML(兩者都可以)?

但我真正想要的是取代我的頁面或usercontrol的整個XAML,也可能嗎?

推理:

我想給我的應用程序的用戶的機會,有應用程序運行(啓動時需要年齡 - 因爲一些歷史遺留問題不能被縮短),並簡單地更新由視圖Blend中的「ctrl + s」。

回答

3

這取決於您是附加事件處理程序還是使用「Name」或「x:Name」屬性來訪問代碼中的UI元素。

尼斯純MVVM應用

首先讓我們假設你有一個使用綁定和專門命令一個不錯的純MVVM應用程序,這樣你就不會使用命名UI元素或代碼隱藏事件處理程序。對你有好處:你有一個非常乾淨的應用程序架構,我喜歡你。

在這種情況下,所有你需要做的就是創建XAML文件的臨時副本與x:Class屬性去掉,並呼籲:

Application.LoadComponent(this, uriToTemporaryCopy); 

醜陋的不純的非MVVM應用

現在讓我們假設你使用了一個名爲x的元素:你的代碼後面的名字或者名字(淘氣,淘氣,淘氣!),或者你使用XAML附加了一個事件處理器(不太淘氣但不是純粹的)。你沒有一個漂亮的乾淨的建築,但我仍然喜歡你。

在這種情況下,Application.LoadComponent不會自行完成,因爲這些設置需要與代碼隱藏進行集成。您還需要找到調用BAML編譯器的方法。

由於代碼隱藏的整合已經編譯到您的網頁或用戶控件的子類,有一些限制:

  1. 您不能添加,刪除或更改事件處理程序的順序分配
  2. 你不能更改命名元素的名稱或序列或添加更多命名元素

如果遵守這些規則,通常將合併到您的類中的生成代碼不會更改,因此您可以加載新的XAML將文件轉換爲正在運行的應用程序而不會破壞任

的程序是:

  1. 編譯XAML文件由A到BAML要麼)構建含有項目,B)創建臨時項目和在編譯,或C)直接調用在PresentationBuildTasks標記編譯任務。
  2. 使用Application.LoadComponent加載BAML文件,就像您在純解決方案中編輯XAML文件一樣。

在已編譯的.csproj項目中,任何已編譯的BAML文件都將在obj/debug或obj/release目錄下找到,擴展名爲.baml。如果您直接調用標記編譯器任務,則可以決定輸出位置。

什麼是BAML文件?

對於那些不知道的人來說,BAML基本上是一個壓縮和優化的XAML二進制形式,並且是您的XAML存儲在.exe或.dll中的方式。它還具有直接鏈接到XAML沒有的生成代碼的功能。

+0

謝謝! :-) 我的應用程序是純MVVM,因爲我不喜歡背後的代碼。 :-D – StormianRootSolver 2010-06-25 08:51:25

相關問題