Dynamically Loading XAML
Loading XAML at run time is really simple. I wrote a small sample to load the XAML at run time and than attach the event handler with the XAML object. I created following XAML page and copied it to the debug folder.
<Page
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
Title="Page1">
<Grid>
<Button Margin="0,0,9,38" Name="button1" Height="82" HorizontalAlignment="Right" VerticalAlignment="Bottom" Width="132">Button</Button>
</Grid>
</Page>
and here is the C# code
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
LoadXAMLMethod();
}
Button ButtoninXAML;
public void LoadXAMLMethod()
{
try
{
StreamReader mysr = new StreamReader("Page1.xaml");
DependencyObject rootObject = XamlReader.Load(mysr.BaseStream) as DependencyObject;
ButtoninXAML = LogicalTreeHelper.FindLogicalNode(rootObject, "button1") as Button ;
ButtoninXAML.Click += new RoutedEventHandler(Button_Click);
this.Content = rootObject;
}
catch (FileNotFoundException ex)
{
MessageBox.Show(ex.Message.ToString());
}
}
public void Button_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Hi WPF");
}
}
}
do not forget to add following namespaces.
using System.IO;
using System.Windows.Markup;
Comments
- Anonymous
September 10, 2007
Thanks Ashish,This sample works nicely; I wonder if you could help me with a follow-up question?I have placed (static) controls down half a Window, and want to dynamically load different Pages into the other half at runtime (i.e. different buttons on the left will show up different pages on the right).I have tried placing a ContentControl on the right-hand side of my Window, and running the following code: StreamReader mysr = new StreamReader("MyPage.xaml"); DependencyObject rootObject = XamlReader.Load(mysr.BaseStream) as DependencyObject; ContentControl displayPage = FindName("displayPage") as ContentControl; displayPage.Content = rootObject;and I get an exception "Page can have only Window or Frame as parent."How do I load a xaml Page, not into a whole window, but just into part of one?Your help is much appreciated,Kind regards,Ian Randall - Anonymous
September 11, 2007
your Best bet in this scenario would be to use a Frame control on lower half of your page and set the source property of the frame to call different pages - Anonymous
September 11, 2007
Thanks again Ashish,I also discovered that creating the 'subpage' as a UserControl (with exactly the same Xaml) allows you to set the Content property on a ContentControl...Regards,Ian Randall - Anonymous
February 16, 2014
This is by far the most elegant way I've seen this done. Bravo! - Anonymous
February 19, 2014
Hi Ashish. I understand that this post is kinda old, but I would like to ask you a question.I have recreated your example in WPF and it Works as you say. But I tried to replicate it to Windows Phone 8 and it is not working.Can you point out the differences when implementing XamlReader for WP8? I cannot use XamlReader.Load(mysr.basestream) the way you do.Thanks in advance.