مضيفا برمجيا أزرار - مشكلة في اشتراك في الحدث الماوس

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

سؤال

وايم إضافة قائمة أزرار في رمز والاشتراك أيضا إلى الأحداث MouseLeave بهم. لكل زر ط subcribe إلى الحدث مع وظيفة غير معروفة، والمشكلة هي أنني عندما تشغيل التطبيق أنها تشترك جميعها في وظيفة مجهولة الماضية. هنا هو رمز، أرجو أن أكون أوضحت نفسي.

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 مع لاس "module.Description"

والشكر -Alejandro

هل كانت مفيدة؟

المحلول

<وأ href = "http://blogs.msdn.com/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx" يختلط = "نوفولو noreferrer" > وهذه مسألة مع الطريقة 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" بدلا من حلقة متغير "وحدة".

نصائح أخرى

وأنا لا أعرف ما هي اللغة هذا، ولكنها قد تكون C #.

وإذا كان كذلك، تحتاج معالجات زر انقر فوق الحدث ليكون لها "المرسل وجوه" وحجة EventArgs إلى وظيفة.

وو"المرسل وجوه" يمكن ان اقول لكم ما تم الضغط على زر.

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

وهذا مجرد مثال، وهناك طرق أفضل لتحديد الزر الذي هو من مقارنة حقل النص، ولكن تحصل على هذه الفكرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top