2016-05-23 14 views
0

Ich muss ein einfaches passendes Spiel machen. Mit diesem passenden Spiel muss ich ein Bild zeigen, wenn ich darauf klicke. Vor dem Klick-Event wird nur eine Farbe angezeigt. Ich habe bereits ein Verfahren, das wie so Bilder auf den Etiketten zuordnet:wie man ein label image auf click event zeigt

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); 
      } 
     } 
    } 

Ich dachte auch, dass ich zwei weitere Listen für die letzten zugewiesen Bilder und Etiketten zu machen hatte. Also kann ich sie im click-Event über die ints-Liste als Index-Indikatoren erneut zuweisen. Ich habe bereits einen Teil meines Click-Ereignisses:

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

     if (clickLbl != null) 
     { 

     } 
    } 

Meine Gedanken sind, dass ich irgendwie habe te Index von clickLbl in der Labelliste zu überprüfen. Aber ich weiß nicht wie. Ich kann hier völlig falsch liegen, aber ich würde gerne eine gute Methode dafür hören. Kann mir bitte jemand helfen? Ich bin im Moment wirklich ahnungslos.

das sind die Schritte sollte es gehen durch:

  1. Wenn die Anwendung gestartet die Etiketten nicht Bilder

  2. haben sollten, wenn der Benutzer das Etikett klickt zeigt es Bild ist, das in zugewiesen wurde die imgToLbl() Methode

  3. das Bild ist nun sichtbar

HINWEIS:

Ich kann keine Pictureboxen anstelle der Etiketten verwenden. Wir müssen Etiketten verwenden. sonst würde ich diese Frage nicht stellen

+2

Ihre "Notiz" macht es scheint, als ob Sie wissen würden, was zu tun ist, wenn Sie mit 'PictureBox'es beschäftigen. Kannst du erklären, was du in diesem Fall tun würdest und welche Schwierigkeiten du hast, wenn du dieselbe Logik auf "Label's" anwendest? Wie auch immer, es ist unklar, was Sie genau machen wollen. Was soll bei Label-Klick passieren? Welches Bild sollte es zeigen und warum? – CodeCaster

+0

Mit Picturebox können Sie die Sichtbarkeit des Bildes einstellen, und mit Labels können Sie nicht. Dies ist, was mich beunruhigt –

+0

Aber wenn etwas nicht sichtbar ist, kann es Click-Ereignisse auch nicht auslösen. Bitte [bearbeiten] Sie Ihre Frage und erklären Sie Schritt für Schritt, was passieren soll und wo Sie stecken bleiben. – CodeCaster

Antwort

2

Sie scheinen eine Menge irrelevanten Code zu haben und haben einige relevante Codes weggelassen. Also müssen wir das, was Sie wirklich fragen, zurückentwickeln.

Es scheint, als ob Sie eine Sammlung von N Bilddateien haben, und auf Ihrem Formular haben Sie ein Panel mit N Label-Steuerelementen. Sie möchten Bilder zufällig den Beschriftungen zuweisen, aber nur das Bild auf dem Etikett anzeigen, wenn auf die Beschriftung geklickt wird.

Zunächst würde ich dringend empfehlen, the General Naming Conventions zu folgen und keine ungarische Notation zu verwenden oder Abkürzungen zu verwenden.

Das heißt, Ihr Problem könnte mit der Control.Tag Eigenschaft gelöst werden, wo Sie Informationen über ein Steuerelement speichern können.

So Ihre „imgToLbl“ -Methode wird dies:

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++; 
    } 
} 

Diese Methode speichert den Index des List<Image> in der Label.Tag Eigenschaft, so dass, wenn ein Etikett klicken, können Sie die Tag-Wert überprüfen und verwenden, die auf Index in die Bildsammlung:

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

Sie könntetableLayoutPanel1.Controls.GetChildIndex(clickLbl) verwenden, um den Index des Steuerelements zu erhalten; Dies entspricht der aktuellen Initialisierung der Beschriftungen.

Alternativ können Sie einfach einen Verweis auf die Steuerelemente in einem List<Label> selbst halten, und sie dem übergeordneten Steuerelement programmgesteuert hinzufügen - Das spart Ihnen (gut, hätte Sie gespeichert: P) viel Arbeit im Designer und Sie würde sich weniger darauf verlassen, wie WinForms seine Control s steuert.

Es gibt Ihnen auch die volle Kontrolle über die Indizes, so können Sie sie zum Beispiel mit einem List<Image> von Bildern vergleichen.

Verwandte Themen