我有一种情况,我必须管理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次尝试时弹出3次。
我想要的是在点击时只弹出一次这个消息框(即使我在另一次点击后一直点击按钮)。
编辑:新的更新代码是我试图缩短的实际情况所以上次我没有包含很多代码(因为我没有怀疑那部分)。
我想做的是:
我必须在运行时(uint64 / 32/16/8)中选择4种给定数据类型中的1种数据类型(这将是用于读取文件的数据类型(构造函数调用中的“fileContent”),但它与问题i无关问,所以留下太多的讨论)。选择该数据类型后,我点击button
显示一些内容。 (所以每次我首先从combo box
选择“数据类型”,然后按button
显示与该数据类型对应的一些数据,然后我再次从组合框中选择另一种数据类型,然后再次我按“按钮”,但这次它弹出消息2次,当我重复相同的第3次弹出消息箱3次)。
假设我首先在运行时(在第一次尝试中)在组合框中选择“uint64
”,然后我点击按钮显示消息框,它将弹出消息框一次。现在没有关闭应用程序我的第二个选择到组合框是uint32
(第二次尝试),再次点击“按钮”这次弹出这个消息框2次。我不知道为什么?并在第三次尝试时弹出3次。
(1)为什么消息框会重复? 感谢您的帮助,我真的想知道它的原因,但还不能理解。
答案 0 :(得分:2)
每次更改组合框时,您都会创建一个新的B
对象。这样每次都会添加一个新的处理程序,而不会删除以前的处理程序。您需要在添加新处理程序时取消订阅旧处理程序,或者只添加一个处理程序并简单地修改它依赖的数据,以便该处理程序在触发时正常运行。