问题:我将要在Silverlight中打开的页面名称存储在数据库中。当我启动应用程序时,我想将页面设置为此字符串
所以不是这样:
this.RootVisual = new MainPage();
我想要这样的东西
string pageName = getValueFromDatabase()
if (!PageExists(pageName))
throw error
else
this.RootVisual = SomeWizzyMethodToCreatePage(pageName)
我想我需要在这里使用反射来查找所有页面(PageExists),然后以某种方式创建一个新实例(SomeWizzyMethodToCreatePage)。
答案 0 :(得分:6)
假设您的意思是您从数据库中获取要确定要显示的页面名称的页面的名称。
我将采用最简单的示例,其中所有页面都在单个应用程序集和单个已知名称空间中。它可以这么简单: -
Type pageType = Assembly.GetExecutingAssembly().GetType("SilverlightApplication1." + pageName);
RootVisual = (UIElement)Activator.CreateInstance(pageType);
也许更灵活的方法是在数据库中存储AssemblyQualifiedName
。这样页面可以在不同的程序集和/或命名空间中,它只需要存在于XAP中(我不确定它是否可以在缓存的程序集库zip中)。如果页面名称是AssemblyQualifiedName
,则代码变为: -
Type pageType = Type.GetType(pageName);
RootVisual = (UIElement)Activator.CreateInstance(pageType);