【问题标题】:How can I load a UserControl by specifying a string value?如何通过指定字符串值来加载 UserControl?
【发布时间】:2011-02-21 11:49:36
【问题描述】:

我有一些 UserControls 命名为 a1、a2、b1、b2...,我想根据两个变量的值加载其中一个。例如,如果var1 = avar2 = 1,则会加载名为a1UserControl

有没有办法做到这一点?也许其他一些替代方法?

switch 语句在这里不是一个可行的选择,因为会有大约 200 个不同的用户控件。

【问题讨论】:

    标签: c# .net wpf user-controls


    【解决方案1】:

    您可以使用 .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); 的内容,以便在单击包含我的用户控件名称的按钮时动态加载我的用户控件
    【解决方案2】:

    您可以使用Activator.CreateInstance 从类型的字符串名称创建UserControl 实例。

    但您最好使用样式或控件模板来解决这个问题 - 这些都是减少 WPF 中代码量及其复杂性的好工具。

    【讨论】:

      【解决方案3】:

      一个强大的可能性是使用XamlReader 来创建您的控件。

      在您的示例中,这不是所希望的,但使用 xaml-reader 的一大优势是您还可以在初始化期间通过 xamlReader 初始化控件的属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-05
        • 1970-01-01
        • 1970-01-01
        • 2022-07-31
        • 2016-11-16
        • 1970-01-01
        • 1970-01-01
        • 2021-11-12
        相关资源
        最近更新 更多