Dynamic Code with XAML
November 13th, 2008
No comments
XAML ile ilgili yaptığım bir araştırma esnasında dış bir kaynaktan gelen kodu XAML içerisinde nasıl çalıştıracağım konusunda bir kaç örnekle karşılaştım. Eğer özellikle banner rotation yapacaksanız, veya canlı bir feed’i tamamiyle dışarıdan almayı düşünüyorsanız eminim oldukça işe yarayacaktır.
using Sys = System;
using SysIO = System.IO;
using SysWinMarkup = System.Windows.Markup;
using SysXml = System.Xml;
using SysXmlLinq = System.Xml.Linq;
public static class XamlUtils {
public static object GetXamlObject(string source) {
SysXml.XmlDocument _xmlDocument = new SysXml.XmlDocument();
_xmlDocument.LoadXml(source);
return Xaml.GetXamlObject(_xmlDocument);
}
public static object GetXamlObject(SysXml.XmlDocument xmlDocument) {
const string xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation";
const string xmlns_x = "http://schemas.microsoft.com/winfx/2006/xaml";
if(string.IsNullOrEmpty(xmlDocument.DocumentElement.GetAttribute("xmlns"))) {
xmlDocument.DocumentElement.SetAttribute("xmlns", xmlns);
}
if(string.IsNullOrEmpty(xmlDocument.DocumentElement.GetAttribute("xmlns:x"))) {
xmlDocument.DocumentElement.SetAttribute("xmlns:x", xmlns_x);
}
SysIO.TextReader _stringReader = new SysIO.StringReader(xmlDocument.OuterXml);
SysXml.XmlReader _xmlReader = new SysXml.XmlTextReader(_stringReader);
return SysWinMarkup.XamlReader.Load(_xmlReader);
}
}
Kullanımı:
System.Windows.Controls.Grid _gridObject = XamlUtils.GetXamlObject("<grid><textblock>ok</textblock></grid>") as System.Windows.Controls.Grid;
this.Content = _gridObject;
Görüldüğü gibi, dış bir kaynaktan alınan/okunan string’i XamlUtils.GetXamlObject metodu ile XAML’e dönüştürebiliyoruz. Burada dikkat etmemiz gereken bu metoddan dönen objenin XAML’in root element’ine düzgün cast edilmesinin gerekliliği. (Örnekte root element’i Grid olarak ele aldım)

