Programmgesteuertes Hinzufügen von Schaltflächen - Problem mit Abonnement für ein Maus-Event

StackOverflow https://stackoverflow.com/questions/1806005

Frage

Im eine Liste der Schaltflächen im Code hinzufügen und auch ihr mouseleave-Ereignis abonnieren möchte. Für jede Taste i mit einer anonymen Funktion zum Ereignis Feed abonieren, das Problem ist, dass, wenn ich die app laufen sie alle auf die letzte anonyme Funktion abonniert haben. Hier ist der Code, ich hoffe, ich erklärte mich.

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;
}

Wenn ich laufe die App sie alle Anruf show mit dem las „module.Description“

Danke -Alejandro

War es hilfreich?

Lösung

Dies ist ein Problem mit dem # Weg C schließt sich über Schleifenvariablen eine temporäre Variable hinzufügen innen und verwenden Sie diese in Ihre anonyme Methode.

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);
}

Beachten Sie die Verwendung der lokalen Variablen „themodule“ statt die Schleifenvariable „-Modul.“

Andere Tipps

Ich weiß nicht, welche Sprache das ist, aber es könnte sein, C #.

Wenn ja, Button-Click-Ereignishandler müssen einen "Objekt Absender" haben und ein EventArgs Argument an die Funktion.

Die "object sender" kann Ihnen sagen, welche Taste gedrückt wurde.

Button pressedButton = (Button)sender;
if(pressedButton.Text.Equals("Button 1")
    doStuff();

Das ist nur ein Beispiel, es gibt bessere Möglichkeiten, zu bestimmen, welche Taste es ist als das Textfeld zu vergleichen, aber Sie bekommen die Idee.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top