kodaman.org yeni bir oluşum olduğu için ne kadar ilgileneni var bilemiyorum ama benim ilk yazım microsoft’un hem windows presentation foundation’da hem de silverlight’da ortak kullandığı xaml hakkında olacak.

xaml ile dinamik olarak herhangi bir dış kaynaktan penceremizin içerisine kod ekleyebilmemiz mümkün. bu ne işimize mi yarar? eğer programlarımızda değişen reklam alanlarına veya kullanıcı girdisine göre oluşacak static bir animasyondan fazlasına ihtiyacımız olduğunda bize yardımcı olur.

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);}}

Geldik “nasıl kullanırız?” sorusuna, öncelikle dinamik olarak yüklenecek xaml’in ilk element’inin hangi nesne olacağı bizim için önemli. Ben örneğimde System.Windows.Controls namespace’i altındaki Grid’i ele alacağım, sizin kullanımınızda Canvas, StackPanel, Button, Image olabilir; bu konuda tamamen özgürsünüz.

System.Windows.Controls.Grid _gridObject = XamlUtils.GetXamlObject(“ok“) as System.Windows.Controls.Grid;
this.Content = _gridObject;

Yukarıdaki örnekte ben kodu kullandığımız pencerenin içeriğini tamamen xaml string’inden yüklenen xaml’e eşitledim, siz StackPanel gibi bir kontrol kullanıyorsanız. (kontrolismi).Children.Add(_gridObject) gibi bir komutla xaml’i başka bir kontrol içerisine de yerleştirebilirsiniz.