将用户控件动态添加到Silverlight 4页面

时间:2010-04-14 21:48:50

标签: silverlight silverlight-4.0

我正在使用silverlight 4为我们的应用程序构建类似“仪表板”的iGoogle。

每个用户仪表板(其中的管理单元及其位置)将存储在数据库中。每个管理单元都是一个用户控件,例如...... AwesomeSnapin.xaml。

在silverlight的仪表板页面上,我正在检索用户仪表板,这是一个包含snapin信息的snapin对象的集合。我可以存储页面或类的名称或任何需要的内容。

我有以下代码循环浏览snapins集合,将它们添加到仪表板页面。在测试中,我刚刚对单个snapin项进行了硬编码。这是原型代码:

        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 path,以较好者为准)。

1 个答案:

答案 0 :(得分:3)

我现在假设UserSnapin.Snapin.Name在这种情况下是“BudgetCheck”并且所有Snapins都在AmsiSL.eFinancials命名空间中找到。我还假设您的Usercontrols被编译到同一个应用程序集中。您可以使用此代码: -

    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);
    }

如果snapins是一个库而不是你可以使用Type.GetType(string)静态方法来解析snapInType的值,但你也需要知道程序集名称。