#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 или ссылки на сборку?)