Loading XAML
If you use the x:Class
attribute to generate a class from your XAML file, you can instantiate
the tree of objects defined in the XAML by creating an instance of the
relevant class. However, you are not required to generate a
class.
If you do not generate a class, there are two ways in which you can get from XAML to a tree of objects. You can either parse the XAML at runtime, or you can precompile it at build time into a binary form called BAML and load that BAML at runtime. The precompiled approach performs better and offers the benefit of being able to use code behind. However, runtime XAML parsing gives you the freedom to decide at runtime what XAML to use. Tools such as XamlPad obviously need to use runtime parsing, but it could also be useful if you want to generate XAML by running an underlying XML data source through an XSLT (although data binding often provides better solutions than runtime XAML generation—see the section on data-driven UI in Chapter 7).
Parsing XAML at Runtime
The System.Windows.Markup
namespace defines a XamlReader
class. This has a Load method,
which takes either a Stream or an
XmlReader. Example A-57 passes an XmlTextReader, which derives from XmlReader.
Example A-57. Parsing XAML at runtime
StringReader sr = new StringReader(@"
<Canvas xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>
<Rectangle Width='30' Height='100' Fill='Red' />
</Canvas>");
XmlTextReader xr = new XmlTextReader(sr);
Canvas tree = (Canvas) XamlReader.Load(xr); ...