在程序运行期间编译/执行XAML

我想创建一个WPF应用程序,它从数据库中检索XAML代码并显示检索到的代码。

让我们说数据库返回以下代码:

  

如何在运行时执行此代码(或者可能只是mainGrid的内容)?

XamlReader类专门用于此目的。 使用其Load方法动态加载xaml。

编辑 – 这里的链接可能是您感兴趣的。

这就是我解决问题的方法:

我有3个文件MainWindow.xaml,MainWindow.xaml.cs和wpftest.csproj。

MainWindow.xaml:

      

MainWindow.xaml.cs

 namespace wpftest { using System.Windows; ///  /// Interaction logic for MainWindow.xaml ///  public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void ButtonBase_OnClick(object sender, RoutedEventArgs e) { MessageBox.Show("Hello world", "does it work?"); } } } 

wpftest.csproj (注意:这个文件非常大,并且大部分内容都不是必需的。您可以按照本指南创建更简化的解决方案: 演练:从Scratch创建MSBuild项目文件 )

     Debug AnyCPU {E3FBAE41-AF7E-4C7E-A69E-ADAEAEE76FA2} Library Properties wpftest wpftest v4.5 512 {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 4   AnyCPU true full false bin\Debug\ DEBUG;TRACE prompt 4   AnyCPU pdbonly true bin\Release\ TRACE prompt 4           4.0        MSBuild:Compile Designer   MainWindow.xaml Code     

解:

以下代码片段将编译代码,创建dll文件并通过reflection使用创建的dll。 这在应用程序运行时期间(全部)发生。

特别感谢doug这个stackoverflow问题

  private void TestCase4_OnClick(object sender, RoutedEventArgs e) { var globalProperties = new Dictionary(); var buildRequest = new BuildRequestData(@"C:\Users\jbu\wpftest\wpftest.csproj", globalProperties, null, new string[] { "Build" }, null); var pc = new ProjectCollection(); var result = BuildManager.DefaultBuildManager.Build(new BuildParameters(pc), buildRequest); Assembly assembly = Assembly.LoadFrom(@"C:\Users\jbu\wpftest\bin\Debug\wpftest.dll"); var instance = assembly.CreateInstance("wpftest.MainWindow") as Window; if (instance != null) { instance.Show(); } }