在运行时生成xaml文件(页面),并使用uri引用它

在运行时生成xaml文件(页面),并使用uri引用它,xaml,uri,xamlwriter,Xaml,Uri,Xamlwriter,我正在开发一个基于现代UI的wpf应用程序,它有一个gui设计器部分,用户可以在其中添加、拖放、调整控件大小等。控件位置、大小等的属性存储在数据库的表中。用户可以在多个页面中放置控件 我所拥有的: 在应用程序启动时,控件根据页面id定位在页面xaml文件的画布上。编译时,这些页面都在项目中 我想要的是: 我需要一种方法来动态实例化这些页面,并能够使用uri引用每个页面 我所尝试的: 我尝试过创建一个模板页面,并从中实例化每个新页面。然后,我将控件放置在其上。然后,我使用xamlwriter.sa

我正在开发一个基于现代UI的wpf应用程序,它有一个gui设计器部分,用户可以在其中添加、拖放、调整控件大小等。控件位置、大小等的属性存储在数据库的表中。用户可以在多个页面中放置控件

我所拥有的: 在应用程序启动时,控件根据页面id定位在页面xaml文件的画布上。编译时,这些页面都在项目中

我想要的是: 我需要一种方法来动态实例化这些页面,并能够使用uri引用每个页面

我所尝试的: 我尝试过创建一个模板页面,并从中实例化每个新页面。然后,我将控件放置在其上。然后,我使用xamlwriter.save创建一个xaml文件,希望能够使用Uri引用该文件。 但是当我尝试引用xaml文件时失败了

如果你能帮我解决问题,或者有更好的方法,请告诉我

致以最良好的祝愿,
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 ?? ""));
        }
    }
}