2015-09-29 56 views
0

我工作在基於現代用戶界面的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 ?? "")); 
     } 
    } 
} 
相關問題