2008-12-01 58 views
6

是否可以通過xaml文件在運行時進行操作的方式部署WPF Windows應用程序?如果可能的話,我會想象這可以像一個可以將.aspx頁面部署爲內容的asp.net應用程序一樣工作,然後在運行時即時編譯。可以在不編譯xaml的情況下部署wpf應用程序嗎?

我想通過編輯XAML允許在運行時編輯屏幕的簡單佈局。有誰知道這是否可能?

編輯:當我參考xaml文件,我的意思是我的UIElement類相應的xaml。換句話說,我已經使用Xaml和代碼隱藏,繼承,事件處理程序,程序集引用等來定義UserControl類。部署時間到了,我希望能夠保留代碼隱藏功能,但仍然允許xaml被編輯。

回答

6

我有另一個建議你 - 真正的問題是:

「我想,讓一個屏幕的簡單的佈局在運行 - 編輯通過編輯XAML的時間,有誰知道這是否可能?「

答案肯定是「YES」!有很多方法可以做到這一點,當然做一些假設。

如果您不需要在XAML的「動態」部分中處理事件或編寫自定義值轉換器(或其他任何通常會在代碼中執行的操作),那麼您可以簡單地使用XamlReader類來解析包含XAML的XAML文件或字符串。既然你只是編輯佈局,我認爲這些假設是正確的。

所以,這裏是我會做什麼:

1)撰寫您所有的自定義控制,數據模型,數值轉換器等,並且在裝配他們堅持。

2)加載該程序集,可以通過讓應用程序引用它或動態加載它 - 兩者都可以工作。

3)創建一個字符串/文件/資源​​(可以選擇),它具有用於佈局的XAML,並將.NET名稱空間映射到XML名稱空間。確保根元素沒有「x:Class」屬性,因爲您沒有代碼背後的代碼!該字符串將使用標準的WPF控件(如StackPanel)來佈局自定義控件。 (當然你也可以編寫自定義佈局控件)。

4)允許用戶編輯此字符串。當他們編輯它時,使用XamlReader解析文件,然後在窗口中顯示生成的UIElement。

BINGO!

一個問題 - 每次更改XAML時,都會拋出GUI並創建一個新的問題。如果你的圖形用戶界面是健康的(即使當前的插入符號位置很重要),用戶會很快感到惱火。這取決於你打算使用什麼 - 這可能不是問題。

我希望通過一些更多的工作,您可以編寫一個MarkupExtension,用於引用您嘗試佈局的部分。這樣,佈局更改時可以重用它們。

我希望這很清楚。如果沒有,讓我知道,我可以擴展這個概念 - 它會創建一個不錯的博客條目。

5

不容易。 WPF應用程序將其XAML由編譯器翻譯爲.g.cs和.baml,隨後將其編譯爲二進制文件。

當然可以創建一個運行時XAML編譯器。這不是一件容易的事,而且真的需要一些思考,爲什麼不把它當做一個網站來做!

1

如下圖所示,您可以在運行時將XAML加載到應用程序中。

UIElement documentRoot = (UIElement)System.Windows.Markup.XamlReader.Load(xmlReader); 

有一個概念「寬鬆XAML」。寬鬆XAML基本上是讓您打開您的硬盤上(在網頁上或超鏈接)任何XAML文件和能力‘中運行’它無需編譯的瀏覽器。

檢查出其在該blog它只是在IE中打開一組按鈕和自定義控制模板我已實施,http://wpf.ria-labs.com/ux.xaml這個樣本鬆散XAML頁面,您可以將XAML加載到一個WPF應用程序,可以使用。

+0

FWIW,我能用FF3打開它。如果有問題,我安裝.NET 3.5SP1。 – Andy 2008-12-01 17:23:53

+0

但它並沒有真正回答這個問題。操作系統明確指出,這是一個WPF應用程序,所以XAML在Web瀏覽器中顯示的能力完全沒有意義。 – GalacticCowboy 2008-12-01 18:54:31

+0

我使用'Web瀏覽器'來解釋LooseXAML概念的更多特徵。 – 2008-12-02 22:38:45

7

謝謝unthinkableMayhem供參考。

鬆散XAML的問題在於XamlReader在運行時調用時無法將事件連接到程序集中的函數,也沒有動態加載程序集的機制。在XAML中指定處理路由事件的方式是WPF/XAML最大的設計缺陷之一,並且使鬆散的XAML變得無用。

我在將動態語言運行時(DLR)腳本嵌入到XAML中所做的工作對鬆散和編譯XAML都很有用。我的意圖是通過允許在寬鬆的XAML中提供路由事件,命令,值轉換器和其他XAML/WPF概念,讓寬鬆的XAML成爲WPF中的頭等公民。我覺得這已經實現了(雖然我的博客沒有提到動態加載程序集,但是這很簡單)。

如果您堅持,可以部署WPF Windows應用程序,以便可以在運行時操作xaml文件。哎呀,你可以動態生成嵌入腳本的XAML - 不需要大會。男人,這是我說了很長時間最有趣的事情之一。

雖然被警告 - XAML中的「X」只是一個營銷術語。從工程角度來看,它不是可擴展的,所以當你走出微軟制定的道路時,期待一個痛苦的世界。如果你喜歡這種方式,我會很樂意提供幫助 - 我的網站上有詳細的聯繫方式(www.thinkbottomup.com.au)。

乾杯,

2

看看http://xtrememvvm.codeplex.com/

它可以讓讓你使用鬆散XAML文件,但還是勾入事件,數據綁定和路由命令。

  • 克萊

於2012年10月7日編輯: 根據要求由羅伯特·哈維,我上面提到的框架的作者。沒有試圖隱藏任何東西,只是認爲它是相關的,因爲它是開源的。無論如何,我一定會在未來的職位上披露我的聯盟(如果有的話)。

相關問題