Chciałem program który generował bym kod grafu, na podstawie rysunku zrobionego przez użytkownika. Program ma kilka stanów, dodawanie, rysowanie , oczekiwanie itd. Chciałem zamiast kilku metod w stylu lewy_klik_w_tło, prawy_kilk.. i tysiąca if'ów w każdej, mieć dużo malutkich metod i podmieniać je wraz ze zmianą stanu . Taki był plan... Kod w wersji v1 działa tak że nie ważne co będzie się działo ze zmienną _vertexClickHandler, choćby tam null był, to wykona się funkcja przechowywana przez _vertexClickHandler; w momencie internalizacji. Wersja z lambdą działa "normalnie" tylko nie mam pojęcia o co właciwie chodzi :? wytłumaczył by ktoś ta magie?
private Action<object, MouseEventArgs> _vertexClickHandler;
private void AddVertex(object sender, MouseEventArgs e)
{
// v1-nie działa
// Vertex v = new Vertex( _vertexClickHandler));
//v2 działa
Vertex v = new Vertex( (x, y) => { _vertexClickHandler(x, y); });
var pos = e.GetPosition(this.VertexLayer);
v.Draw(pos.X, pos.Y);
}
class Vertex()
{//(...)
public Vertex( Action<object, MouseEventArgs> clickHandler)
{
this.Click = clickHandler;
this._tb = new TextBox();
this._body = new Ellipse();
this._tb.PreviewMouseDown += SendClickToComposite;
this._body.PreviewMouseDown += SendClickToComposite;
}
private void SendClickToComposite(object o, MouseEventArgs e)
{
this.Click(this, e);
}
}