Sure, because an instance of any public .NET class can be serialized as XAML, regardless of how it was
originally declared. The first step is to retrieve an instance that you want to be the root. If you don’t already
have this object, you can call the static System.Windows.Application.LoadComponent method as follows:
System.Uri uri = new System.Uri(“MyWindow.xaml”, System.UriKind.Relative);
Window window = (Window)Application.LoadComponent(uri);
This differs from previous code that uses FileStream to load a .xaml file because with
LoadComponent, the name specified as the Uniform Resource Identifier (URI) does not have
to physically exist as a standalone .xaml file. LoadComponent can automatically retrieve
BAML embedded as a resource when given the appropriate URI (which, by MSBuild convention,
is the name of the original XAML source file). In fact, Visual Studio’s autogenerated
InitializeComponent method calls Application.LoadComponent to load embedded BAML,
although it uses a different overload.
After you’ve gotten a hold of the root element instance, you can use the
System.Windows.Markup.XamlWriter class to get a XAML representation of the root
element (and, therefore, any of its children). XamlWriter contains five overloads of a static
Save method, the simplest of which accepts an object instance and returns appropriate
XAML as a string. For example:
string xaml = XamlWriter.Save(window);
It might sound a little troubling that BAML can be so easily “cracked open,” but it’s really no
different from any other software running locally or displaying UI locally. (For example, you can
easily dig into a website’s HTML, JavaScript, and Cascading Style Sheets [CSS] files.)
No comments:
Post a Comment