Wyłączenie/ włączenie możliwości kliknięcia w obrazek

0

Czesc. Mam kilkanaście PictureBoxów umieszczone na TableLayoytPanel. Każdy ma zdarzenie wywoływane przez kliknięcie myszką.Chodzi o to że gdy kliknę dany obrazek chciałbym aby kolejne kliknięcie w ten sam obrazek nie było obsłużone. Jest na to jakiś szybki sposób na to? Myślałem żeby utworzyc tablice bool canClick i po kliknięciu ustawiać w danym indeksie wartość false i potem po każdym kliknieciu sprawdzać wartość canClick ale czy tego nie można łatwiej obsłużyć?

1

Coś takiego może:

private void pictureBox1_Click(object sender, EventArgs e)
{
     (sender as PictureBox).Click -= pictureBox1_Click;
}
1

W pierwszych liniach handlera obsłużyć zmienną (np logiczną).

Gdzie ta zmienna ?
widget.Tag
Nie ma potrzeby tablicy

w pomyśle widzę słabość: do końca świata będzie wyłączone - coś to ma po jakimś czasie właczyć ?

0

Ogolnie to gra typu Memory. Klikam obrazek- kolejne kliknięcie w niego ma nie wywolac zadnego zdarzenia. Klikam kolejny obrazek i tak samo kolejne klikniecie w niego ma być niemozliwe. Wtedy porównuję obrazki i w zależności czy są parą czy nie odblokowuje możliwość klikania w nie.

1
specjal1990 napisał(a):

... Klikam obrazek- kolejne kliknięcie w niego ma nie wywolac zadnego zdarzenia.

Nie musisz wyłączać specjalnie wyłączać telefonu czy blokować jakiś numer od kolegi z którym nie chcesz rozmawiać, zwyczajnie go ignoruj.
Uwaga to tylko alegoria, ale powinna wystarczyć aby wiedziałeś co robić.

0

Dzięki za podpowiedzi. Użyłem właściwości Tag ze swoją utworzoną klasą.
Mam jeszcze jedno pytanie, na początku programu tworzę tablicę przechowującą PictureBoxy. Użytkownik ma możliwość wyboru wielkości planszy więc czasami jest potrzebne 5 obrazków a innym razem 10. To jest kod tworzący tą tablicę:

public partial class Form1 : Form
    {
               
        static int columns=10, rows=2;
       
        PictureBox[] pictures = new PictureBox[columns*rows];

Problem(a może nie?) w tym, że z góry muszę ustalić maksymalna wielkość tej tablicy czyli 20. Bo gdy ustalę mniejszą to potem tego nie dam rady zmienić w dalszych funkcjach programu. Pewnie lepiej byłoby tworzyć tablicę z tyloma elementami ile potrzebuje? Czy ten nadmiar za bardzo nie szkodzi przy takich liczbach?
Chyba że tablicę PictureBoxów mogę utworzyć w funkcji tworzącej nową grę? Z tym że potrzebowałbym globalnego dostępu do tej tablicy. Dlatego tworzę ją zaraz na początku w głównym ciele programu.

0

Użyj TableLayoutPanel, ustawiasz ile chcesz wierszy/kolumn po czym dodajesz PictureBoxy dynamicznie podpinając pod Tag strukturę zawierającą pola:

  • isClicked
  • PictureId
    nic więcej nie potrzebujesz.
1
specjal1990 napisał(a):

Chodzi o to że gdy kliknę dany obrazek chciałbym aby kolejne kliknięcie w ten sam obrazek nie było obsłużone.

Czyli aplikacja ma się wyłączyć jak klikniesz w obrazek drugi raz? :>

specjal1990 napisał(a):

Jest na to jakiś szybki sposób na to? Myślałem żeby utworzyc tablice bool canClick i po kliknięciu ustawiać w danym indeksie wartość false i potem po każdym kliknieciu sprawdzać wartość canClick ale czy tego nie można łatwiej obsłużyć?

Musisz obsłużyć kliknięcie w obrazek dwa razy, i to obsłużenie powinno wyglądać tak, że jeśli klik występuje pierwszy raz - to wykonywana jest jakaś akcja, a jeśli drugi raz to wtedy nic się nie dzieje (tak, zignorowanie zdarzenia również może być jego obsługą).

Należałoby więc gdzieś zapisać info o tym czy obrazek jest kliknięty (w stanie, gdzieś w logice aplikacji; albo w widoku w jakimś tag, etc) i potem sprawdzać czy jest kliknięty). Ja bym trzymał w logice aplikacji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1