2015-09-29 7 views
0

Im работает над приложением wpf на основе современного пользовательского интерфейса, в котором есть дизайнерская часть gui, где пользователь может добавлять, а затем перетаскивать/изменять размер и т.д. и т. Д. Свойства для позиции управления, размера и т. Д. Хранятся в таблице в базе данных. Существует несколько страниц, на которых пользователь может размещать элементы управления.Создайте файл xaml (страница) во время выполнения и ссылайтесь на него с uri

Что у меня есть: При запуске приложения элементы управления размещаются на холсте на странице (файл xaml) на основе идентификатора страницы. Эти страницы находятся в проекте, когда я компилирую.

Что мне нужно: Мне нужен способ динамически создавать экземпляры этих страниц и иметь возможность ссылаться на каждый с помощью uri.

Что я пытался: Я попытался создать «страницу шаблона» и создать экземпляр каждой новой страницы. Затем я устанавливаю на него элементы управления. Затем я использую xamlwriter.save для создания файла xaml, который, я надеюсь, сможет ссылаться на Uri. Но я терпеть неудачу, когда пытаюсь ссылаться на файл xaml.

Если вы можете помочь мне с моим решением или, если есть лучший способ, пожалуйста, просветите меня.

С наилучшими пожеланиями, Фредрик

ответ

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 ?? "")); 
     } 
    } 
}