Создание пользовательских меток в C# и передача данных в событиях
Я играл с идеей для игры, и реализация шла довольно хорошо, но я наткнулся на камень преткновения.
В основном у меня есть форма, которая покажет деревья талантов. Я просто собираюсь использовать метки для отображения соответствующих деталей, и я хочу создать их программно. Часть отображения работает нормально, часть, с которой я сталкиваюсь, - это добавление обработчика событий к меткам.
Я хочу иметь возможность передавать данные во время обработки события, чтобы я мог определить, какая именно метка была нажата, но я попал в кирпичную стену. Поэтому при щелчке по определенной метке имя соответствующего навыка (просто передавая строку) будет отправлено обработчику события. Любая помощь будет оценена. Вот соответствующий код, который у меня есть:
public void DisplayTree()
{
int i=0;
startPoint.X = 40;
startPoint.Y = 125;
foreach(SkillNode s in tree.tier1)
{
for (i=0; i < s.labels.Count;i++ )
{
//Displays a label for each available rank for a skill
s.labels.ElementAt(i).Text = (i+1).ToString()+"/"+s.maxRank.ToString();
s.labels.ElementAt(i).Location = startPoint;
startPoint.Y += s.labels.ElementAt(i).Height + 2;
s.labels.ElementAt(i).Name = "lbl"+s.name+i.ToString();
//Only enable it to be clicked if the user is at the correct rank
if (s.rank == i)
{
s.labels.ElementAt(i).Enabled = true;
}
else
{
s.labels.ElementAt(i).Enabled = false;
}
//Add Event here
//I want to pass the name of the skill with the event
this.Controls.Add(s.labels.ElementAt(i));
}
startPoint.X += s.title.Width + 5;
startPoint.Y = 125;
}
}
public void LabelClick()
{
//Code here to pick out the name of the label
}
2 ответа
Попробуй это:
public void LabelClick()
{
Console.WriteLine(((Control)sender).Name);
}
Когда вы создаете событие и хотите следовать официальному руководству по стилю C#, вы следуете следующей схеме:
public delegate void {YourName}EventHandler(object sender, {YourName}EventArgs args);
public event {YourName}EventHandler EventName;
Каждая информация о том, что произошло в событии или может быть изменено подписчиком, хранится в классе, который наследует EventArgs
, Делегат также содержит ссылку на отправителя, который является объектом, инициирующим событие.
Когда вы запускаете событие, вы делаете следующее, регулярно в защищенном методе, имя которого совпадает с именем события с префиксом "On":
EventName?.Invoke(this, new {YourName}EventArgs() { Initialize Stuff });
Как видите, вы можете работать с sender
и идентифицировать объект. В вашем случае вы также можете изменить object sender
в UIElement sender
(или аналогичный), чтобы упростить идентификацию материала без актерского состава.