プログラムでボタンを追加する-マウスイベントのサブスクリプションに関する問題

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

質問

コードにボタンのリストを追加し、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;
}

アプリを実行すると、すべてのlas" module.Description"でshowInfoを呼び出します

ありがとう -アレハンドロ

役に立ちましたか?

解決

これは、C#がループ変数を閉じる方法に関する問題です。一時変数を inside に追加し、匿名メソッドで使用します。

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

これは単なる例であり、テキストフィールドを比較するよりも、どのボタンであるかを判断するより良い方法がありますが、アイデアは得られます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top