2017-07-07 50 views
1

我一直在玩游戏的想法,并且实现进行得相当顺利,但是我碰到了一个绊脚石。在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

如果你将'Click'处理程序附加到一个标签,那么第一个参数通常是'sender',它是发送event_的对象。 –

+0

谢谢你回复马特。我最初是这样做的,但我无法将自定义数据添加到它。有没有办法附加额外的数据? – rm46

+0

Winforms和WPF控件都有一个'Tag'属性,您可以指定任意对象。但是,请注意,这不是执行这些事情的特别好方法。正确的方法是使用数据绑定并拥有MVC或MVVM模型。但这超出了简单答案的范围。 –

回答

0

试试这个:

public void LabelClick() 
    { 
     Console.WriteLine(((Control)sender).Name); 
    } 
+0

谢谢,我将能够使用它来使事情工作。 – rm46

0

当您创建一个事件,并要遵循官方的C#风格指南,你按照下面的模式:

public delegate void {YourName}EventHandler(object sender, {YourName}EventArgs args); 
public event {YourName}EventHandler EventName; 

有关事件中发生的事情或用户可以操纵的每个信息都存储在继承EventArgs的类中。该委托还包含对发件人的引用,该发件人是触发该事件的对象。

当你解雇你做了之后,经常在具有相同的名称与“开”事件作为前缀的保护方法的事件:

EventName?.Invoke(this, new {YourName}EventArgs() { Initialize Stuff }); 

正如你所看到的,你可以工作与sender并识别该对象。在你的情况下,你也可以将object sender改为UIElement sender(或类似),以便更容易识别没有演员的东西。

相关问题