Добавление кнопок программным способом - проблема с подпиской на событие мыши - PullRequest
2 голосов
/ 27 ноября 2009

Я добавляю список кнопок в коде, а также подписываюсь на их событие mouseleave. Для каждой кнопки, которую я подписываю на событие с анонимной функцией, проблема в том, что когда я запускаю приложение, все они подписываются на последнюю анонимную функцию. Вот код, надеюсь, я объяснил сам.

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

Когда я запускаю приложение, все они вызывают showInfo с помощью las "module.Description"

Спасибо -Alejandro

Ответы [ 2 ]

3 голосов
/ 27 ноября 2009

Эта проблема связана с тем, как C # закрывает переменные цикла. Добавьте временную переменную внутри и используйте ее в своем анонимном методе:

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

Обратите внимание на использование локальной переменной "theModule" вместо переменной цикла "module".

0 голосов
/ 27 ноября 2009

Я не знаю, на каком это языке, но это может быть C #.

Если это так, обработчики событий нажатия кнопки должны иметь «отправителя объекта» и аргумент EventArgs для функции.

«Отправитель объекта» может сказать вам, какая кнопка была нажата.

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

Это всего лишь пример, есть лучшие способы определить, какая это кнопка, чем сравнение текстового поля, но вы поняли.

...