KiranBabu M Ответов: 3

Динамическое создание usercontrol в WPF


Привет,
Это может быть просто, но на данный момент я застрял здесь.
Я хочу создать пользовательский элемент управления динамически из кода позади и отобразить его в окне WPF.
если я нажму на кнопку, она должна создать usercontrol и отобразить его.
Итак, в событии нажатия кнопки, если я создаю кнопку или метку динамически, она работает нормально.

напр.:
Button btn=new Button();
btn .Height =25;
btn.Width=80;
btn.Content="codebutton";

если я создаю пользовательский элемент управления, он не отображается

Код C# :
UserControl u1=new UserControl();
u1.Height=100;
u1 .Width=100;
uniformgrid1 .Children .Add (u1);

может ли кто-нибудь решить эту проблему, плз.

спасибо

David Eyal

Всем привет,
Я пытался сделать то же самое - только создав массив из 5 меток.
Я не вижу надписей во время выполнения. Может ли кто-нибудь найти мне причину этого?
Большое вам спасибо заранее!
Эяль,
Вот мой код:

публичное главное окно()
{//Label Height= " 28 "HorizontalAlignment=" Left "Margin=" 221,98,0,0 "Name=" lblScoreD6 "VerticalAlignment=" Top "Width=" 100 "Content= "0" />
метод InitializeComponent();
Label[] scoresLabelArr = новая метка[5];
int location = 98;
for (int i = 0; i < scoresLabelArr. Length; i++)
{
scoresLabelArr[i] = новая метка();
scoresLabelArr[i].Высота = 28;
scoresLabelArr[i].Ширина = 100;
scoresLabelArr[i]. HorizontalAlignment = горизонтальное выравнивание.Слева;
scoresLabelArr[i]. VerticalAlignment = вертикальное выравнивание.Верхний;
scoresLabelArr[i].Содержание = " 0";
scoresLabelArr[i].Margin = новая толщина (211, местоположение, 0, 0);
scoresLabelArr[i].Передний План = Кисти.Черный;
// В конструкторе-я назвал сетку [grid1]
значение grid1.Children. Add ((Label)scoresLabelArr[i]);
местоположение += 34;

}

3 Ответов

Рейтинг:
9

Wayne Gaylard

UserControl - это всего лишь базовый элемент управления для создания ваших собственных элементов управления. Если вы не добавите элементы управления в UserControl, вам нечего будет показывать.

Надеюсь, это поможет.


KiranBabu M

спасибо за ответ.
хороший момент, чтобы заметить.

Sergey Alexandrovich Kryukov

Да, хорошая мысль, достаточно, чтобы объяснить проблему; 5.
--СА

Рейтинг:
21

#realJSOP

//Create the button
Button btn = new Button();
btn .Height = 25;
btn.Width = 80;
btn.Content = "codebutton";

// create a container for ithe button
Grid grid = new Grid();
// add the button to the container
grid.Children.Add(btn);

// create the user control
UserControl u1 = new UserControl();
u1.Height = 100;
u1 .Width = 100;
// set the content to be the grid you created earlier
u1.Content = grid;

// put the user control into the uniformgrid

uniformgrid1.Children.Add(u1);


РЕДАКТИРОВАТЬ ==============

Кстати, когда я создаю такие элементы управления динамически, я обычно создаю элементы управления, а затем их контейнеры, а затем, наконец, добавляю контейнеры в родительские контейнеры. таким образом, я могу ясно видеть цепочку отношений родитель/ребенок, бросив быстрый взгляд на код.


KiranBabu M

спасибо.
теперь я все понял ясно

Uday P.Singh

мои 5!

Sergey Alexandrovich Kryukov

То же самое-правильно-5.
--СА

Рейтинг:
18

Tarun.K.S

Причина, по которой ничего не отображается, заключается в том, что нет никакого контента, установленного для вашего UserControl.

Приведенный ниже код отобразит Hello:

UserControl u1 = new UserControl();
u1.Height = 100;
u1.Width = 100;
u1.Content = "Hello"
uniformgrid1.Children.Add(u1);


Просто чтобы добавить еще один пример, Предположим, вы хотите добавить Image в вашу UserControl.

UserControl u1 = new UserControl();
u1.Height = 100;
u1.Width = 100;
Image img = new Image();
img.Source = new BitmapImage(new Uri(@"C:\Windows.png",UriKind.RelativeOrAbsolute));
u1.Content = img;
uniformgrid1.Children.Add(u1);


Обновление :
Комментарий от kiranvls:
Привет Тарун, в приведенном выше коде пользовательский элемент управления динамически создается с изображением в качестве контента. Теперь я добавил обработчик событий u1.События mousemove +=новый MouseEventHandler(uc_MouseMove); частная uc_MouseMove недействительным(объект отправителя, MouseEventArgs E) в { вот иам можете получить доступ к динамически созданного объекта управления пользователя(У1); } как получить имя объекта в обработчик событий плз, помогите мне.

Ответ:
Конечно, вы можете получить к нему доступ. Проверьте аргумент " e " в mousemove eventhanlder. Он богат свойствами, включая свойство источника. Вы должны привести исходное свойство к UserControl. Вот что вы должны сделать:

void uc_MouseMove(object sender, MouseEventArgs e)
{
    // Here is your UserControl.
    UserControl uControl = (UserControl)e.Source;
}


Надеюсь, это поможет.


KiranBabu M

Работает отлично..
Именно то, что мне было нужно..
спасибо..

Tarun.K.S

Рад, что это помогло!

KiranBabu M

Привет Тарун,
В приведенном выше коде пользовательский элемент управления динамически создается с изображением в качестве содержимого. Теперь я добавил обработчик событий
u1. MouseMove +=новый MouseEventHandler(uc_MouseMove);

private void uc_MouseMove(отправитель объекта, MouseEventArgs e)
{
Здесь я не могу получить доступ к динамически созданному объекту управления пользователем (u1);
}
как получить имя объекта в обработчике событий plz, помогите мне.

Tarun.K.S

Я обновил ответ. Проверь сейчас.

Christian Graus

Пожалуйста, не отвечайте на новые вопросы, подобные этому, они не индексируются сайтом. Я дал ему тот же ответ, где он разместил новый вопрос, и держу пари, что теперь он не отметит его, и он будет потерян. Если бы он просто задал этот вопрос здесь, его вообще не было бы в указателе. Скажите людям, чтобы они разместили свой новый вопрос и ответили на него там.

Tarun.K.S

Конечно, я сделаю это в следующий раз.

Uday P.Singh

мои 5!

Tarun.K.S

Спасибо!

Sergey Alexandrovich Kryukov

Никакого содержания? -- хороший улов. Мой 5.
--СА

Tarun.K.S

Большое спасибо, СА!