通过运行时加载XAML XML?

我们正在迁移到Winforms到基于WPF的解决方案。 我们有自定义XML定义,用于在运行时构建Windows窗体。

由于XAML是基于XML的,我们可以使用XAML定义定义一个HelloWorldWindow.xml文件,并且可以将其加载到WPF应用程序中而不需要CSharp文件后面的任何代码吗? 我们将在运行时附加钩子后面的代码。

如何在运行时附加代码?

使用此XAML创建XML文件Tempwin.xml

                  

使用以下xaml创建示例WPF应用程序

           

将下面的C#代码粘贴到Button_Click的代码中

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

如果要在运行时加载xaml,则无法在XAML文件后面提供任何代码。 所以我在创建xml之前删除了x:Class属性

事件挂钩….

                     

 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"); } 

您可以像这样动态显示Xaml:

  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 

有关详细信息,请参阅XamlReader类: http : //msdn.microsoft.com/en-us/library/ms613427%28v=VS.95%29.aspx

我已经在运行时加载了XAML,这是一个简短的例子

 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 = @" " + "" + "" + "" + "";