Создание пользовательских меток в 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 (или аналогичный), чтобы упростить идентификацию материала без актерского состава.

Другие вопросы по тегам