Pergunta

Im acrescentando uma lista de botões no código e também assinando o seu evento mouseleave. Para cada botão i subcribe para o evento com uma função anônima, o problema é que quando eu executar o aplicativo todos eles são subscrito para a última função anônima. Aqui está o código, espero me explicou.

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 eu executar o aplicativo que todas as chamadas showInfo com a las "module.Description"

Graças -Alejandro

Foi útil?

Solução

Este é um problema com a forma como C # fecha sobre variáveis ??de laço Adicionar uma variável temporária dentro e usar isso em seu método anônimo:.

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

Observe o uso da variável local "theModule" em vez da variável do laço "módulo".

Outras dicas

Eu não sei que língua este é, mas poderia ser C #.

Se for, manipuladores de evento Click do botão precisa ter um "object sender" e um argumento EventArgs para a função.

O "remetente objeto" pode dizer o que o botão foi pressionado.

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

Isso é apenas um exemplo, há melhores maneiras de determinar qual botão é de comparar o campo de texto, mas você começa a idéia.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top