November 12, 2008 · .net wpf xaml

WPF formuna dinamik XAML kodu enjekte etme

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

  • LinkedIn
  • Tumblr
  • Reddit
  • Pocket
Comments powered by Disqus