Программно добавляющие кнопки - Проблема с подпиской на событие мыши
-
05-07-2019 - |
Вопрос
Я добавляю список кнопок в коде, а также подписываюсь на их событие 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 ".Описание"
Спасибо -Alejandro
Решение
Это проблема с тем, как 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".
Другие советы
Я не знаю, что это за язык, но это может быть C #.
Если это так, обработчики событий нажатия кнопки должны иметь "отправитель объекта" и аргумент EventArgs для функции.
"Отправитель объекта" может сообщить вам, какая кнопка была нажата.
Button pressedButton = (Button)sender;
if(pressedButton.Text.Equals("Button 1")
doStuff();
Это всего лишь пример, есть лучшие способы определить, что это за кнопка, чем сравнивать текстовое поле, но вы уловили идею.