我正在使用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,以较好者为准)。
答案 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
的值,但你也需要知道程序集名称。