0

ユーザーがコントロールを追加してからドラッグ/ドロップ/サイズ変更などできるGUIデザイナー部分を持つモダンUIに基づくwpfアプリケーションに取り組んでいます。コントロールの位置、サイズなどのプロパティは、データベースのテーブルに保存されます。ユーザーがコントロールを配置できるページがいくつかあります。

私が持っているもの: アプリケーションの開始時に、コントロールはページ ID に基づいてページ (xaml ファイル) のキャンバスに配置されます。コンパイルすると、これらのページはすべてプロジェクトに含まれます。

私が欲しいもの: これらのページを動的にインスタンス化し、それぞれを uri で参照できるようにする方法が必要です。

私が試したこと:「テンプレートページ」を作成し、そこから新しいページをそれぞれインスタンス化しようとしました。次に、コントロールを配置します。次に、xamlwriter.save を使用して、Uri で参照できるようにしたい xaml ファイルを作成します。しかし、xaml ファイルを参照しようとすると失敗します。

私の解決策で私を助けることができる場合、またはより良い方法がある場合は、私に教えてください.

よろしく、フレドリック

4

1 に答える 1

0

動的に生成されたページを URI で参照できない場合は、プロジェクトの一部である 1 つ (または複数、場合によってはプール) の組み込みページを使用できます。そのページでは、動的に設定されたデータ テンプレートを含むコンテンツ コントロールを使用できます。これを示すコードを次に示します。

プレースホルダー ページの 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 に答える