2016-05-23 73 views
0

我需要製作一個簡單的匹配遊戲。有了這個匹配的遊戲,我需要顯示一個圖像,當我點擊它。在點擊事件之前,只顯示一種顏色。我已經有其分配圖像像這樣標籤的方法:如何在點擊事件中顯示標籤圖像

private void imgToLbl() 
    { 
     foreach (Control ctrl in tableLayoutPanel1.Controls) 
     { 
      Label imgLbl = ctrl as Label; 
      if (imgLbl != null) 
      { 
       int rndNum = rndImage.Next(0, files.Count); 
       imgLbl.Image = files[rndNum]; 
       lbls.Add(imgLbl); 
       imags.Add(imgLbl.Image); 
       ints.Add(rndNum); 
       files.RemoveAt(rndNum); 
      } 
     } 
    } 

我還以爲我不得不做出其他2只列出了最終的分配圖像和標籤。因此,我可以使用ints列表作爲索引指示器在點擊事件中再次分配它們。我已經有我的單擊事件的一部分:

private void label_click(object sender, EventArgs e) 
    { 
     Label clickLbl = sender as Label; 

     if (clickLbl != null) 
     { 

     } 
    } 

我的想法是,我,不知何故,必須檢查clickLbl的TE指數在標籤列表。但我不知道如何。我可能在這裏完全錯誤,但我希望聽到一個好方法。有人可以幫我嗎?我現在真的無能爲力。

這些步驟應該經歷:

  1. 應用程序啓動時的標籤不應該有圖片

  2. 當用戶點擊該標籤會顯示它這是在指定的圖像所述imgToLbl()方法

  3. 的圖像現在是可見

注意:

我不能使用pictureboxes而不是標籤。我們必須使用標籤。否則我不會問這個問題

+2

您的「註釋」使您看起來像在處理「PictureBox」時會知道該怎麼做。你能解釋一下你在這種情況下會做什麼,以及在將相同的邏輯應用於'Label'時,你會遇到什麼麻煩?無論如何,你不清楚你想要做什麼。標籤點擊應該發生什麼?它應該顯示哪個圖像,爲什麼? – CodeCaster

+0

使用圖片框可以設置圖片可見性,而使用標籤則不能。這是我的煩惱 –

+0

但是如果有東西不可見,它也不能引發Click事件。請[編輯]你的問題,並逐步解釋應該發生什麼以及你卡在哪裏。 – CodeCaster

回答

2

你似乎有很多不相關的代碼,並省略了一些相關的代碼。所以我們必須對你實際要求的內容進行逆向工程。

看起來好像你有一個N圖像文件的集合,並且在你的窗體上你有一個包含N個Label控件的面板。您想隨機將圖像分配給標籤,但只在標籤被點擊時纔在標籤上顯示圖像。首先,我強烈建議您遵循the General Naming Conventions,不要使用匈牙利語法,也不要使用縮寫詞。

這就是說,您的問題可以通過使用Control.Tag屬性來解決,您可以在其中存儲有關控件的信息。

所以你的「imgToLbl」的方法變成這樣:

private List<Image> _files = { /* however this works */ }; 

private void RandomizeImages() 
{ 
    // Randomize the file list. 
    // See http://stackoverflow.com/questions/273313/randomize-a-listt 
    Shuffle(_files); 

    int imageIndex = 0; 

    // Loop over all labels to assign an image index. 
    foreach (Control control in tableLayoutPanel1.Controls) 
    { 
     var imageLabel = control as Label; 
     if (imageLabel == null) 
     { 
      continue; 
     } 

     imageLabel.Tag = imageIndex; 
     imageIndex++; 
    } 
} 

這種方法存儲List<Image>的指數在Label.Tag屬性,因此在點擊一個標籤時,你可以檢查標籤的值,並用它來索引到圖像集合中:

private void Label_Click(object sender, EventArgs e) 
{ 
    Label clickedLabel = sender as Label; 

    if (clickedLabel != null) 
    { 
     var imageIndex = (int)clickedLabel.Tag; 
     clickedLabel.Image = _files[imageIndex]; 
    } 
} 
0

可能使用tableLayoutPanel1.Controls.GetChildIndex(clickLbl)獲得控件的索引;這與您目前如何初始化標籤一致。

或者,您可以簡單地自己保留對List<Label>中的控件的引用,並以編程方式將它們添加到父控件中 - 這樣可以節省您(好吧,本來可以節省您的:P)設計師中的許多工作,而您將更少依賴於WinForms如何控制其Control

它還可以讓您完全控制索引,例如,您可以將它們與圖像的List<Image>相匹配。

相關問題