Редактирование нескольких экземпляров пользовательского элемента управления

#c# #wpf #user-controls #instance #multiple-instances

#c# #wpf #пользовательские элементы управления #экземпляр #несколько экземпляров

Вопрос:

Я почти новичок в C # и создал несколько экземпляров пользовательского элемента управления как такового

 StackPanel StkPnl = new StackPanel();
StkPnl = SP; //SP being the static objRef of the StackPanel in the MainWindow 
for (int i = 0; i < 5; i  )
{
    UserControl UsrCtrl = new UserControl();
    UsrCtrl = new UserControl1();
    UserControl1.TB.Text = "Text:" i;   //TB being the static objRef of the textblock that is in the user control
    UsrCtrl.Name = "UsrCtrl"   i; 
    StkPnl.Children.Add(UsrCtrl);
}
 

Что я хочу сделать, так это иметь возможность вызывать каждый пользовательский элемент управления, который я создал независимо, и редактировать этот конкретный textblock.text. например: отредактируйте текстовый блок UsrCtrl3, не изменяя другие 4 созданных пользовательских элемента управления.

Мне было довольно трудно объясниться. Дайте мне знать, если вам понадобятся какие-либо разъяснения, и я постараюсь сделать все возможное, чтобы объяснить.

Комментарии:

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

2. После создания каждого пользовательского элемента управления в цикле FOR я хотел бы вспомнить конкретный пользовательский элемент управления, который был создан (скажем, третий, созданный в цикле), и отредактировать текстовый блок в этом третьем UserControl . например:

3. Да, конечно, я сам не смог бы сказать это лучше.

Ответ №1:

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

 StkPnl.Children[3].TB.Text = "Some Text";  // edit fourth user control (UsrCtrl3)
 

Или вы можете использовать LINQ для поиска по имени.

Метод SingleOrDefault() ожидает не более одного совпадения. Если совпадение не найдено, он возвращается null .

 var thirdUserControl = StkPnl.Children.SingleOrDefault(x => x.Name == "UsrCtrl3");

if (thirdUserControl != null)
    thirdUserControl.TB.Text = "Some Text";
 

Комментарии:

1. Спасибо за ваш быстрый ответ, и это может показаться глупым вопросом, но при попытке включить то, что вы сказали, я получаю сообщение об ошибке: ‘System. Windows. UIElement’ не содержит определения для ‘TB’ и никакого метода расширения ‘TB’, принимающего первый аргумент типа ‘System. Windows. Может быть найден UIElement’ (вам не хватает директивы using или ссылки на сборку?)