Как я могу загрузить UserControl, указав строковое значение? - PullRequest
0 голосов
/ 21 февраля 2011

У меня есть UserControl с именами a1, a2, b1, b2 ... и я хочу загрузить одну из них в зависимости от значения двух переменных.Например, если var1 = a, var2 = 1, будет загружен UserControl с именем a1.

Есть ли способ сделать это?Возможно, какой-то другой альтернативный подход?

A switch оператор не является жизнеспособным вариантом здесь, потому что будет около 200 различных UserControls.

Ответы [ 3 ]

3 голосов
/ 21 февраля 2011

. Вы можете использовать .NET Reflection для загрузки элемента управления по его значению 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.


        }
    }
}
2 голосов
/ 21 февраля 2011

Вы можете использовать Activator.CreateInstance для создания экземпляра UserControl из строкового имени типа.

Но вам лучше решить эту проблему с помощью шаблонов стилей или элементов управления - это отличные инструменты для уменьшения объема кода и его сложности в WPF.

0 голосов
/ 21 февраля 2011

Мощная возможность - использовать XamlReader для создания ваших элементов управления.

В вашем примере это нежелательно, но большое преимущество использования xaml-reader заключается в том, что вы также можете инициализировать свойства вашего элемента управления во время инициализации через xamlReader.

...