¿Cargando XAML XML a través del tiempo de ejecución?

Estamos migrando a Winforms a una solución basada en WPF. Tenemos una definición XML personalizada que se utiliza para crear el formulario de Windows en tiempo de ejecución.

Dado que XAML está basado en XML, ¿podemos definir un archivo HelloWorldWindow.xml con definición XAML y se puede cargar en la aplicación WPF sin ningún código detrás de los archivos CSharp? Adjuntaremos el código detrás del enlace en tiempo de ejecución.

¿Cómo adjuntar el código en tiempo de ejecución?

Cree un archivo XML Tempwin.xml usando este XAML

                  

Cree una aplicación WPF de muestra con la siguiente xaml

           

Pegue el siguiente código C # en el código detrás del Button_Click

  StreamReader mysr = new StreamReader(@"D:\Tempwin.xml"); FrameworkElement rootObject = XamlReader.Load(mysr.BaseStream) as FrameworkElement; content.Children.Add(rootObject); 

si desea cargar xaml en tiempo de ejecución, no puede dar ningún código detrás de su archivo XAML. Así que eliminé el atributo x: Clase antes de crear el xml

Eventos enganchando ….

                     

 Button ButtoninXAML; private void Button_Click(object sender, RoutedEventArgs e) { StreamReader mysr = new StreamReader(@"D:\Tempwin.xml"); FrameworkElement rootObject = XamlReader.Load(mysr.BaseStream) as FrameworkElement; ButtoninXAML = LogicalTreeHelper.FindLogicalNode(rootObject, "btnTest") as Button; ButtoninXAML.Click += new RoutedEventHandler(Button_Click1); content.Children.Add(rootObject); } private void Button_Click1(object sender, RoutedEventArgs e) { MessageBox.Show("Added At Runtime"); } 

Puede mostrar Xaml dinámicamente así:

  string text = @""; // Convert to stream // You can also just stream the xaml from a file, using a FileStream MemoryStream stream = new MemoryStream(ASCIIEncoding.UTF8.GetBytes(text)); // Convert to object TextBlock block = (TextBlock)System.Windows.Markup.XamlReader.Load(stream); //... now you can put that TextBlock somewhere, for example in your main Window 

Consulte la clase XamlReader para obtener más información: http://msdn.microsoft.com/en-us/library/ms613427%28v=VS.95%29.aspx

He terminado de cargar XAML en tiempo de ejecución, aquí hay un breve ejemplo

 Grid grd = new Grid(); var grdEncoding = new ASCIIEncoding(); var grdBytes = grdEncoding.GetBytes(myXAML); grd = (Grid)XamlReader.Load(new MemoryStream(grdBytes)); Grid.SetColumn(grd, 0); Grid.SetRow(grd, 0); parentGrid.Children.Add(grd); private String myXAML = @" " + "" + "" + "" + "";