在程序运行期间编译/执行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(); } }