Can I use XamlReader.Load or InitializeFromXaml from a WPF Window, for the Window definition?
.net, wpf, xaml
Solution
You cannot create a dynamic page that has the x:class attribute. However if the code behind is the same for every dynamic page you can trick it by changing your template to:
private string XamlTemplate = @"
<control:BaseWindow
xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
xmlns:control='WhateverHere'
Title='@@TITLE'
Height='346' Width='380'>
<Grid>...
When you are ready to parse this use:
XamlReader.Parse(xaml);
If you wanted to access items in the code behind you would this.FindName("btnUpdate") in the code-behind.
Problem
I want to produce some library code that will be included into WPF applications. The library may pop up a Window, depending on circumstances. I can define the Window in XAML, but I'd like to treat the XAML as a template. At runtime, at the time the Window is being created so that it can be displayed, I want to replace certain tags in the Xaml template with runtime-defined values. What I want to do is something like this: ``` public partial class DynamicXamlWindow : Window { Button btnUpdate = null; public DynamicXamlWindow() { string s = XamlTemplate; // replace some things in the XamlTemplate here Window root = System.Windows.Markup.XamlReader.Load(...); Object _root = this.InitializeFromXaml(new StringReader(s).ReadToEnd()); //?? btnUpdate = // ??? //InitializeComponent(); } ``` The XamlTemplate string looks like this: ``` private string XamlTemplate = @" <Window x:Class='@@CLASS' xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' Title='@@TITLE' Height='346' Width='380'> <Grid> ... ``` I've seen examples where a button or a section is defined in XAML and loaded dynamically. But this is not a button or section. The XamlTemplate provides the XAML for the actual Window. Is this possible either with InitializeFromXaml or XamlReader.Load ? If so, how? Can I then retrieve the controls defined in the XAML, for example btnUpdate in the code fragment above. How?