2017-07-07 19 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(或類似),以便更容易識別沒有演員的東西。

相關問題