【发布时间】:2011-02-21 11:49:36
【问题描述】:
我有一些 UserControls 命名为 a1、a2、b1、b2...,我想根据两个变量的值加载其中一个。例如,如果var1 = a、var2 = 1,则会加载名为a1 的UserControl。
有没有办法做到这一点?也许其他一些替代方法?
switch 语句在这里不是一个可行的选择,因为会有大约 200 个不同的用户控件。
【问题讨论】:
标签: c# .net wpf user-controls
我有一些 UserControls 命名为 a1、a2、b1、b2...,我想根据两个变量的值加载其中一个。例如,如果var1 = a、var2 = 1,则会加载名为a1 的UserControl。
有没有办法做到这一点?也许其他一些替代方法?
switch 语句在这里不是一个可行的选择,因为会有大约 200 个不同的用户控件。
【问题讨论】:
标签: c# .net wpf user-controls
您可以使用 .NET 反射通过其String 值加载控件。
您可以使用类似这样的代码来动态创建对象。
using System.Reflection;
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
//this is the full namespace name of UserControl.
// you could use something like String.Format("WpfApplication1.{0}", "uc1") to put in a function and pass through.
string ucName = "WpfApplication1.uc1";
Type newType = Type.GetType("WpfApplication1.uc1", true, true);
object o = Activator.CreateInstance(newType);
//Use the object to how ever you like from here on wards.
}
}
}
【讨论】:
stkPanel.Children.Add(UIElment o); 的内容,以便在单击包含我的用户控件名称的按钮时动态加载我的用户控件
您可以使用Activator.CreateInstance 从类型的字符串名称创建UserControl 实例。
但您最好使用样式或控件模板来解决这个问题 - 这些都是减少 WPF 中代码量及其复杂性的好工具。
【讨论】:
一个强大的可能性是使用XamlReader 来创建您的控件。
在您的示例中,这不是所希望的,但使用 xaml-reader 的一大优势是您还可以在初始化期间通过 xamlReader 初始化控件的属性。
【讨论】: