0

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

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

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

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

如果您可以帮助我解决我的问题,或者有更好的方法,请赐教。

最好的问候,弗雷德里克

4

1 回答 1

0

如果您不能使用 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 ?? ""));
        }
    }
}
于 2015-09-30T08:07:21.707 回答