MainPage类外部的侦听事件在按钮单击事件上多次调用方法(重复)
本文关键字:事件 调用 方法 重复 按钮 外部 MainPage 单击 | 更新日期: 2023-09-27 17:57:40
我有一种情况,我必须在MainPage
类之外管理按钮单击事件(假设在B
类中)。这是我正在使用的代码:
namespace TEST
{
public partial class MainPage: UserControl
{
public event Action simpleEvent;
public MainPage()
{
}
private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (comboBox1.SelectedItem as string)
{
case "UInt8":
B obj4 = new B(this, fileContent, "UInt8");
break;
case "UInt16":
B obj1 = new B(this, fileContent, "UInt16");
break;
case "UInt32":
B obj2 = new B(this, fileContent, "UInt32");
break;
case "UInt64":
B obj3 = new B(this, fileContent, "UInt64");
goto
default;
default:
MessageBox.Show("check");
break;
}
}
private void ButtonClick_EVENT(object sender, RoutedEventArgs e)
{
// I try to listen outside the class this way.
if (simpleEvent != null)
simpleEvent();
}
}
Class B
{
public B(MainPage Obj, byte[] fileContent, string type)
{
switch (type = Obj.comboBox1.SelectedItem as string)
{
case "UInt8":
{
//do something
break;
}
case "UInt16":
{
//do something
break;
}
case "UInt32":
{
//do something
break;
}
case "UInt64":
{
//do something
goto
default;
}
default:
{
break;
}
}
Obj.simpleEvent += () = > MyMethod(Obj);
}
public void MyMethod(MainPage Obj)
{
// This MessageBox repeats 2 times on second time button click
// and 3 times on 3rd button click .
// It should be called once even on second/third/fourth etc. button clicks.
MessageBox.Show("Repetition check");
}
}
}
问题是我的方法被反复调用。例如,当我第一次点击按钮时,它只会被调用一次(这很好)。如果我再次点击按钮,弹出的消息框会出现2次,第三次尝试时会再次弹出3次。
我想要的是在点击时只弹出一次这个消息框(即使我一次又一次地点击按钮)。
编辑:新更新的代码是我试图缩短的实际情况,所以上次我没有包含太多代码(因为我没有怀疑那个部分)。
我想做的是:在运行时,我必须在4个给定的数据类型中选择一个数据类型(uint64/32/16/8)(这将是读取文件的数据类型(构造函数调用中的"fileContent"),但它与我问的问题无关,所以留下了太多讨论)。选择该数据类型后,我单击button
显示一些内容。(所以每次我第一次从combo box
中选择"数据类型",然后按button
显示与该数据类型对应的一些数据,然后我再次从组合框中选择另一个数据类型,然后再次按"按钮",但这一次它会弹出消息2次,当我重复同样的第三次时,它会弹出信息框3次)。
假设我在运行时(第一次尝试)首先在组合框中选择了"uint64
",然后单击按钮显示消息框,它会弹出一次消息框。现在,在没有关闭应用程序的情况下,我对组合框的第二次选择是在uint32
上(第二次尝试时),我再次单击"按钮",这次这个消息框弹出了两次。我不知道为什么?在第三次尝试时,它会弹出3次。
(1) 为什么信息框重复?谢谢你提前的帮助,我真的很想知道原因,还不能理解。
每次更改组合框时,都会创建一个新的B
对象。这样每次都会添加一个新的处理程序,而不会删除以前的处理程序。在添加新的处理程序时,您需要取消订阅旧的处理程序,或者只添加一个处理程序,然后简单地修改它所依赖的数据,以便该处理程序在触发时正确操作。