2010-04-14 84 views
1

我建立一个类似的iGoogle“仪表板”为我们的应用程序使用Silverlight 4动态添加用户控件到一个Silverlight 4页

每个用户信息中心(其中snapins和它们的位置),将存储在数据库中。每个管理单元都是一个用户控件,例如... AwesomeSnapin.xaml。

在silverlight中的仪表板页面上我正在检索用户仪表板,它是包含管理单元上的信息的管理单元对象的集合。我可以存储页面或类的名称或任何需要的名称。

我有以下代码,它通过管理单元集合循环来将它们添加到仪表板页面。在测试中,我只是硬编码一个单元项目。这里是原型代码:

 foreach (var UserSnapin in op.Entities) 
     { 
      UserControl uc = new AmsiSL.eFinancials.BudgetCheck(); 

      Canvas.SetLeft(uc, UserSnapin.PositionLeft); 
      Canvas.SetTop(uc, UserSnapin.PositionTop); 

      Layout.Children.Add(uc); 

      MessageBox.Show(String.Format("Added {0}",UserSnapin.Snapin.Name)); 
     } 

上述工作正常......但当然会为用户仪表板定义的每个项目添加BudgetCheck管理单元。当然,该消息框仅用于调试目的。

如何根据集合中的数据更改第3行以加载用户控件类(使用classname或xaml路径,以哪个更好为准)。

回答

3

我假设在这种情况下UserSnapin.Snapin.Name是“BudgetCheck”,并且在AmsiSL.eFinancials名称空间中找到所有Snapin。我还会假设你的用户控件被编译到同一个应用程序组件中。您可以使用此代码: -

foreach (var UserSnapin in op.Entities) 
    { 
     Type snapInType = Assembly.GetExecutingAssembly() 
      .GetType("AmsiSL.eFinancials." + UserSnapin.Snapin.Name); 

     UIElement snapIn = (UIElement)Activator.CreateInstance(snapInType); 

     Canvas.SetLeft(snapIn , UserSnapin.PositionLeft); 
     Canvas.SetTop(snapIn , UserSnapin.PositionTop); 

     Layout.Children.Add(snapIn); 
    } 

IF的snapins是一个一个库,而不是你也许可以使用Type.GetType(string)静态方法来解析snapInType价值,但你需要知道组件名称为好。

+0

谢谢一旦我的项目在RTM中运行,我会尝试一下。我不确定反射是最好的方法还是加载XAML。 – PilotBob 2010-04-16 14:43:30

+0

工程很好。谢谢你。 – PilotBob 2010-04-23 19:39:15