2010-02-25 101 views
2

問題:我將我希望在Silverlight中打開的頁面名稱存儲在數據庫中。當我啓動的應用程序,我想將頁面設置爲這個字符串Silverlight:如何動態創建頁面

因此而不是這樣的:

this.RootVisual = new MainPage(); 

我想是這樣的

string pageName = getValueFromDatabase() 
if (!PageExists(pageName)) 
    throw error 
else 
    this.RootVisual = SomeWizzyMethodToCreatePage(pageName) 

我想我需要使用反射在這裏找到所有的頁面(PageExists),然後以某種方式創建一個新的實例(SomeWizzyMethodToCreatePage)。

+0

當你說你保存你要在數據庫中打開網頁,你實際上意味着你存儲要打開的頁面的__name__? – AnthonyWJones 2010-02-25 22:14:30

+0

是的,名字。已更新,謝謝。 – 2010-02-25 22:27:29

回答

6

假設你的意思是你想要確定要顯示的頁面名稱的頁面的名稱名稱

我將舉一個最簡單的例子,其中所有頁面位於單個應用程序集合和單個已知名稱空間中。它可以是如此簡單: -

Type pageType = Assembly.GetExecutingAssembly().GetType("SilverlightApplication1." + pageName); 
RootVisual = (UIElement)Activator.CreateInstance(pageType); 

也許更flexibable的辦法是在數據庫中AssemblyQualifiedName來存儲。這樣,頁面可以在不同的程序集和/或名稱空間中,只需要存在於XAP中(我不確定它是否可以在緩存的大會庫zip中)。如果頁面名稱是一個AssemblyQualifiedName那麼代碼變爲: -

Type pageType = Type.GetType(pageName); 
RootVisual = (UIElement)Activator.CreateInstance(pageType); 
+0

明智的答案,安東尼!從我+1。乾杯。 – Anvaka 2010-02-25 22:44:07

+0

偉大的工程...只需添加我的視圖命名空間.GetType(「SilverlightApplication1.Views。」+ pageName); – 2010-02-25 23:09:45

+0

+1好答案。 – 2010-02-25 23:14:45