在运行时生成xaml文件(页面),并使用uri引用它
我正在开发一个基于现代UI的wpf应用程序,它有一个gui设计器部分,用户可以在其中添加、拖放、调整控件大小等。控件位置、大小等的属性存储在数据库的表中。用户可以在多个页面中放置控件 我所拥有的: 在应用程序启动时,控件根据页面id定位在页面xaml文件的画布上。编译时,这些页面都在项目中 我想要的是: 我需要一种方法来动态实例化这些页面,并能够使用uri引用每个页面 我所尝试的: 我尝试过创建一个模板页面,并从中实例化每个新页面。然后,我将控件放置在其上。然后,我使用xamlwriter.save创建一个xaml文件,希望能够使用Uri引用该文件。 但是当我尝试引用xaml文件时失败了 如果你能帮我解决问题,或者有更好的方法,请告诉我 致以最良好的祝愿,在运行时生成xaml文件(页面),并使用uri引用它,xaml,uri,xamlwriter,Xaml,Uri,Xamlwriter,我正在开发一个基于现代UI的wpf应用程序,它有一个gui设计器部分,用户可以在其中添加、拖放、调整控件大小等。控件位置、大小等的属性存储在数据库的表中。用户可以在多个页面中放置控件 我所拥有的: 在应用程序启动时,控件根据页面id定位在页面xaml文件的画布上。编译时,这些页面都在项目中 我想要的是: 我需要一种方法来动态实例化这些页面,并能够使用uri引用每个页面 我所尝试的: 我尝试过创建一个模板页面,并从中实例化每个新页面。然后,我将控件放置在其上。然后,我使用xamlwriter.sa
Fredrik如果您无法使用URI引用动态生成的页面,那么您可以使用一个或多个,可能是项目的一部分的内置页面池。在该页面上,您可以使用动态设置的数据模板创建内容控件。下面的一些代码演示了这一点: 占位符页面的XAML:
<Window
x:Class="WpfApplication3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ContentControl x:Name="mainContent" />
</Grid>
</Window>
此演示背后的代码:
using System.IO;
using System.Text;
using System.Windows;
using System.Windows.Markup;
namespace WpfApplication3
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
mainContent.ContentTemplate = GenerateDataTemplate();
}
public DataTemplate GenerateDataTemplate()
{
StringBuilder xamlTemplate = new StringBuilder();
xamlTemplate.Append("<DataTemplate");
xamlTemplate.Append(" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"");
xamlTemplate.Append(" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">");
xamlTemplate.Append(" <TextBlock Text=\"This is a test\" FontSize=\"40\" Foreground=\"Red\" />");
xamlTemplate.Append("</DataTemplate>");
return (DataTemplate)XamlReader.Load(GenerateStreamFromString(xamlTemplate.ToString()));
}
private MemoryStream GenerateStreamFromString(string value)
{
return new MemoryStream(Encoding.UTF8.GetBytes(value ?? ""));
}
}
}