przesylanie dodatkowych arg. do eventu Click

0

Witam mam problem...tworze dynamicznie picturebox'y...do kazdego z nich mam event Click:

 
pictureBox.Click += new EventHandler(this.pictureBox_Click);

Problem polega na tym ze chcialbym przeslac do tego zdarzenia sciezke do zdj. ktore ma zostac powiekszone...
Czyli majac:

private void pictureBox_Click(object sender, EventArgs e)
{
    
}
 

chcialbym miec 3 arg. string imagePath
Jak moge uzyskac takie cos?
Lub ewentualnie dziedziczac po klasie moglbym zrobic overload metody click i dodac 3 arg?

1

Zdarzenie Click zadelkarowane jest w Control i nie możesz go override'ować.
Zdarzenia powinny być typu EventHandler lub EventHandler<TEventArgs>, co determinuje że metoda ich obsługi ma dwa parametry sendera i argumenty zdarzenia. Nie rzuca się zdarzeń jakiś dziwnych typów, tylko tworzy klasę dziedziczącą z EventArgs. Poza tym zdarzenie powinno zawierać dane charakteryzujące jakoś zdarzenie. Skąd chcesz brać informacje jakie zdjęcie powiększyć, ścieżkę tego zdjęcia?
Proponuję żebyś:

  1. do składowania ścieżki użył właściwości Tag w PictureBox, w obsłudze zdarzenia rzutujesz sender na PictureBox i odczytujesz ścieżkę z Tag
  2. dziedzicz z PictureBox i dodaj property string PhotoPath, w obsłudze zdarzenia rzutuj sender na swój picture box i odczytujesz ścieżkę z PhotoPath
  3. dziedzicz z PictureBox i override OnClick i z niego rzucać swoje zdarzenie EventHandler<SuperClickArgs> SuperClick
  4. ścieżki możesz trzymać w słowniku, gdzie kluczem będzie PictureBox, w obsłudze zdarzenia po senderze z słownika pobierasz ścieżkę
    i pewnie jeszcze kilka rozwiązań można wymyślić
1

Heh, no mógłbyś dziedziczyć po PictureBoxie żeby coś takiego uzyskać...

Ale pytanie po co?

Nie wystarczy Ci coś takiego:?

private void pictureBox_Click(object sender, EventArgs e)
{
    Image img = ((PictureBox)sender).Image;
}
0

Opcja nr 1 byla najprostsza i najszybsza w zakodowaniu, wszystko dziala oczywiscie...sry ze dopiero teraz odp...

Jednak moglbym cie poprosic o jedna rzecz...skoro jestesmy juz w temacie...
Jak by wygladaly rozwiazania nr 2 i 3, bo co do czwartego to nie ma problemu...;)

0

opcja 2

public class PictureBoxEx : PictureBox
{
  public string PhotoPath {get;set;}
}
// gdzieć obsługa zdarzenia Click
void pictureBoxEx_Click(object sender, EventArgs e)
{
  PictureBoxEx p = sender as PictureBoxEx;
  if (p != null)
  {
    OpenBigPhoto(p.PhotoPath);
  }
}

Zamiast tworzyć pictureBoxy, tworzysz PictureBoxEx i ustawiasz właściwość PhotoPath, a w obsłudze zdarzenie pobierasz z niej ścieżkę do dużego obrazka.

opcja 3

public class PictureBoxEx2EventArgs : EventArgs
{
  public string PhotoPath {get; private set;} // argumenty powinny mieć właściwości tylko do odczytu!!! set jest prywatny, dlatego mogę go użyć w konstruktorze, ale w innej klasie nie będę mógł zmienić tej właściwości
  public PictureBoxEx2EventArgs(string photoPath)
  {
    this.PhotoPath = photoPath;
  }
}
public class PictureBoxEx2 : PictureBox
{
  public event EventHandler<PictureBoxEx2EventArgs> ClickEx;
  
  public string PhotoPath {get;set;} // oczywiście możesz mieć gdzie indziej składowaną ścieżkę, ale musisz ją skądś mieć żeby przekazać do argumentów zdarzenia

  private override void OnClick(EventArgs e)
  {
    base.OnClick();
    if (ClickEx != null) // jeśli nie ma obsługi zdarzenia, to eventHandler jest null, należy sprawdzić, niektórzy o tym zapominają
      ClickEx(this, new PictureBoxEx2EventArgs(this.PhotoPath));
  }
}

// gdzieć obsługa zdarzenia Click
void pictureBoxEx2_ClickEx(object sender, PictureBoxEx2EventArgs e)
{
  OpenBigPhoto(e.PhotoPath);
}
0

Myślę, że najlepszy jest pomysł z użyciem właściwości Tag. Podpięcie ścieżki jest proste, odczytanie w zdarzeniu również, nie trzeba pisać żadnych klas, nowych kontrolek, etc. etc.

0

dzieki ci bardzo...do 2 rozwiazania byc moze doszedlbym sam do 3 z pewnoscia nie bo .net znam od kilku dni xD...gdyby wszyscy dawali takie odp....;)

hmmm....a co do problemu z tym przezroczystym kolorem moglbys pomoc...?

0

Mam kod:

 
System.Drawing.Color backColorpictureBox = System.Drawing.Color.FromArgb(20, 50, 50, 250);
this.panel.BackColor = backColorpictureBox;

Co bym nie dal tlo zawsze jest szare....juz kij z tym ale nie ma w ogole przezroczystosci.....
Dziwne bo np przy rysowaniu prostakatu takiego problemu nie mialem....a wiem ze struktura picturebox.BackColor przyjmuje tez kanal alpha...

btw: bylo w poscie wyzej ale juz edytowalen ;]

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