2009-08-11 96 views
3

我創建了一個WPF應用程序,其中我使用C#代碼動態構建XAML元素,然後將它們添加到根「容器」網格中。WPF:在運行時將帶頁面功能添加到窗口中作爲XAML

我試圖做的是充分利用的功能在Blend和創建有自己的一套背後的邏輯,故事板代碼的一些XAML頁面等

我想加載XAML在運行時但是,由於某種原因,我的方法無法正常工作,而且我爲什麼不知所措。

這是我之前做過的。在我的根窗口中創建一個新的MyModule並將其添加到我的contentRoot中。

myModule = new MyModule(); 
contentRoot.Children.Add(myModule); 

(方法的作品)MyModule的類擴展Canvas和由.XAML文件和.CS代碼隱藏文件。 XAML只是一個根畫布,而.CS具有創建元素並將其添加到根畫布的所有邏輯。

當我使用相同的方法,其中MyModule現在擴展頁面什麼都沒有顯示。 XAML現在有很多內容,包括Canvas.Resources Canvas.Triggers和其他一些元素。

如何從類中加載預創建的XAML內容,包括運行時邏輯後面的代碼?

回答

4

Page和Canvas是XAML中的兩種不同類型的組件。

Page是框架元素,Canvas是容器,可以有多個控件放置在絕對的x,y座標中。還有哪些頁面只有一個屬性「內容」,您可以將頁面視爲高級內容控件。

Blend必須創建與Canvas相關的方法,並且它將像「Canvas」一樣。SetLeft」等,但他們肯定不會在頁面工作。

你的頁面類必須有類型的一個內容‘畫布’,你必須添加里面的所有控制‘畫布’頁面內,這會幫助你們。

這是從MSDN文本,

頁可僅具有單個子元素。在頁面上的所有其他元素必須是該元素的後代。通常,網頁的內容託管的佈局元件 - 例如作爲Grid,StackPanel和DockPanel - 承載頁面內容。

在你的情況下,頁面應該主持一個元素「畫布」並添加項目。

或者你爲什麼不試試這個,讓你的MyModule和它是一樣的,然後你創建一個新的頁面,名爲MyModulePage,它應該看起來像這樣。

<MyModulePage> 
    <MyModule/> <!-- that is your canvas generated in blend --> 
</MyModulePage> 
0
FileStream xamlFile = new FileStream("Resources/News/NewsModuleCanvas.xaml", FileMode.Open, FileAccess.Read); 
    Canvas newsCanvas = (Canvas)XamlReader.Load(xamlFile); 
    contentRoot.Children.Add(newsCanvas); 

用它來加載XAML,但是這仍然不給我也加入背後邏輯的代碼的選項。

+1

你是說你想在這個XAML文件後面注入任意代碼嗎?你的代碼在哪裏? – 2009-09-28 19:13:28

+0

注入,我不這麼認爲,我只想訪問後面的代碼中包含的一些方法,以及訪問一些像故事板一樣的XAML元素。 – discorax 2009-09-29 19:51:38

3

我覺得這個問題有點不清楚,但這裏有一些對我有用的東西。

定義爲MyModule的:

<Page x:Class="WpfApplication3.MyModule" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Height="300" Width="300"> 
</Page> 


public partial class MyModule : Page 
{ 
    public MyModule() 
    { 
     InitializeComponent(); 
     this.Content = new TextBlock(new Run("WOW!")); 
    } 
} 

創建了一個名爲MyModuleStandalone.xaml一個獨立的文件:

<local:MyModule xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:local="clr-namespace:WpfApplication3;assembly=WpfApplication3"     
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
</local:MyModule> 

以下作品的代碼。當我顯示c時,它會顯示文本「WOW!」的文本塊。

FileStream xamlFile = new FileStream("MyModuleStandalone.xaml", FileMode.Open, FileAccess.Read); 
MyModule c= (MyModule)XamlReader.Load(xamlFile); 
this.Content = c; 

本地var c是MyModule的一個實例,因此該類的所有代碼都可用。這是你在找什麼?

您不能在獨立XAML文件中使用x:Class屬性,因爲這意味着XAML是分部類,而其他類是在其他位置聲明的。 XamlReader不會支持它。

請記住,當您讀取XAML文件時,您在讀取序列化對象中的。沒有辦法將代碼動態注入到任意獨立的xaml文件中。

+0

你知道嗎,如果你可以訪問C中的屬性,例如開始/停止故事板? – discorax 2009-09-29 19:31:20