Aggiunta programmatica di pulsanti: problema con la sottoscrizione a un evento del mouse
-
05-07-2019 - |
Domanda
Sto aggiungendo un elenco di pulsanti nel codice e anche iscrivendomi al loro evento di mouseleave. Per ogni pulsante che sottoscrivo all'evento con una funzione anonima, il problema è che quando eseguo l'app sono tutti iscritti all'ultima funzione anonima. Ecco il codice, spero di essermi spiegato.
var modules = ModulesSC.GetAllMoudules();
var imageSet = ModulesSC.GetModuleImageSet();
foreach (var module in modules)
{
var btn = new Button();
btn.SetResourceReference(Control.TemplateProperty, "SideMenuButton");
btn.Content = module.Title;
btn.MouseEnter += (s, e) => { ShowInfo(module.Description); };
btn.MouseLeave += (s, e) => { HideInfo(); };
ModuleButtons.Children.Add(btn);
}
protected void HideInfo()
{
DescriptionLabel.Visibility = Visibility.Collapsed;
DescriptionText.Text = string.Empty;
}
protected void ShowInfo(string description)
{
DescriptionLabel.Visibility = Visibility.Visible;
DescriptionText.Text = description;
}
Quando eseguo l'app, tutti chiamano showInfo con il modulo las " Descrizione "
Grazie -Alejandro |
Soluzione
Questo è un problema con il modo in cui C # chiude le variabili del ciclo. Aggiungi una variabile temporanea dentro e usala nel tuo metodo anonimo:
foreach (var module in modules)
{
var theModule = module; // local variable
var btn = new Button();
btn.SetResourceReference(Control.TemplateProperty, "SideMenuButton");
btn.Content = theModule.Title; // *** use local variable
btn.MouseEnter += (s, e) => { ShowInfo(theModule.Description); }; // *** use local variable
btn.MouseLeave += (s, e) => { HideInfo(); };
ModuleButtons.Children.Add(btn);
}
Nota l'uso della variabile locale " theModule " invece della variabile loop " modulo. "
Altri suggerimenti
Non so che lingua sia, ma potrebbe essere C #.
In tal caso, i gestori di eventi Clic pulsante devono disporre di un "mittente oggetto" e un argomento EventArgs alla funzione.
Il "mittente oggetto" può dirti quale pulsante è stato premuto.
Button pressedButton = (Button)sender;
if(pressedButton.Text.Equals("Button 1")
doStuff();
Questo è solo un esempio, ci sono modi migliori per determinare quale pulsante è rispetto al confronto del campo di testo, ma ottieni l'idea.