2014-07-07 47 views
0

我發現了一些關於如何從靜態文件加載Xaml的stackoverflow和其他互聯網上的帖子:他們建議創建一個指向文件系統上找到的文件的XmlReader或StreamReader,但是.xaml文件我會喜歡閱讀將被編譯與程序集的其餘部分,所以它不會有一個有意義的文件Uri。我不想將這個文檔複製到程序集的任何位置。有沒有辦法從已經編譯到程序集的.xaml文件中讀取數據?如何使用XamlReader從程序集內的Xaml文件加載?

我也知道我可以簡單地從代碼本身內的一個很長的字符串文本中讀取,但我寧願不這樣做 - 從Xaml產生的UIElement應該很容易編輯,我通過編輯它在Xaml文件中。

爲了說明什麼,我希望,這裏有一個例子:

private void LoadUIElementFromCompiledXaml() 
{ 
    XmlReader xmlReader = new XmlReader("*Uri for .xaml document within my assembly*"); 
    UIElement elementLoaded = (UIElement)XamlReader.Load(xmlReader); 
} 

我提前道歉,如果答案是公然明顯。

回答

6

在將程序集中的Xaml作爲嵌入式資源加載之前,需要進行一些設置。我會帶你通過一個例子,然後從那裏你可以定製它來滿足你的需求。

  1. 在您的項目中創建文件夾。將其命名爲XAML。
  2. 將XAML文件添加到XAML文件夾。我們稱之爲Sample.xaml。
  3. 右鍵單擊Sample.Xaml並選擇屬性。將構建操作的值設置爲「嵌入式資源」。
  4. 右鍵單擊該項目並選擇屬性。記下默認命名空間值。我們將使用它作爲路徑的一部分。對於這個例子讓我們假設它是「myNameSpace對象

你的代碼中加載XAML資源會是這個樣子:

string defaultNamespace = "MyNamespace"; 
string folderName = "XAML"; 
string fileName = "Sample.xaml"; 

string path = String.Format("{0}.{1}.{2}", defaultNamespace, folderName, fileName); 

using (Stream stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(path))   
{ 
    object root = XamlReader.Load(stream); 
} 

正如你所看到的路徑,資源是由該如果文件夾路徑有多個級別,則使用點作爲文件夾分隔符代替反斜槓,例如Xaml \ Subfolder應該是Xaml.Subfolder。

+0

非常感謝 - 在對嵌入式資源進行了一些額外閱讀之後,這似乎是Micr認可的做法osoft,並且最適合我的需求。 –

+1

要獲取資源的名稱,請在某處放置一個斷點,然後將其粘貼到即時窗口中:System.Reflection.Assembly.GetExecutingAssembly()。GetManifestResourceNames() – Maxence

相關問題