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 |

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top