Динамически добавлять пользовательские элементы управления на страницу Silverlight 4 - PullRequest
1 голос
/ 15 апреля 2010

Я создаю iGoogle-подобную "панель инструментов" для нашего приложения с Silverlight 4.

Каждая пользовательская панель инструментов (которая привязывается и их позиции) будет храниться в базе данных. Каждая оснастка является пользовательским элементом управления, например ... AwesomeSnapin.xaml.

На странице панели инструментов в Silverlight я получаю панель пользователя, которая представляет собой набор объектов оснастки, которые содержат информацию о оснастке. Я могу сохранить имя страницы или класса или все, что нужно.

У меня есть следующий код, который перебирает коллекцию оснасток, чтобы добавить их на страницу панели инструментов. В тестировании я только что жестко запрограммировал один элемент оснастки. Вот код прототипа:

        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 этого для загрузки класса пользовательского элемента управления (используя имя класса или путь xaml, в зависимости от того, что лучше) на основе данных в коллекции.

1 Ответ

3 голосов
/ 15 апреля 2010

На данный момент я предполагаю, что UserSnapin.Snapin.Name в этом случае - «BudgetCheck» и что все оснастки находятся в пространстве имен 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);
    }

ЕСЛИ оснастки являются библиотекой, вместо этого вы, вероятно, можете использовать статический метод Type.GetType(string) для разрешения значения для snapInType, но вам также необходимо знать имя сборки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...