MainPage
클래스 외부에서 버튼 클릭 이벤트를 관리해야하는 상황이 있습니다 (클래스 B
에서 가정). 다음은 내가 사용하고있는 코드입니다.MainPage 클래스 외부에서 이벤트 수신 버튼 클릭 이벤트에서 여러 번 호출하는 메소드 (반복적으로)
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 번 팝업됩니다.
내가 원하는 것은이 메시지 상자를 한 번만 클릭하여 팝업으로 표시하는 것입니다 (다른 클릭 후 하나의 버튼을 계속 클릭하더라도).
편집 : 새롭게 업데이트 된 코드는 코드를 짧게 만들려고 시도한 실제 상황입니다. (내가 그 부분을 의심하지 않았기 때문에) 많은 코드를 포함하지 않았습니다.
무엇을하려고합니까 : 런타임에 4 개의 주어진 데이터 유형 (uint64/32/16/8) 중에서 하나의 데이터 유형을 선택해야합니다 (파일을 읽는 데 사용할 데이터 유형 ("fileContent "생성자 호출에서),하지만 내가 물어 질문에 관련이 너무 많은 토론을 떠난다.) 그 데이터 형식을 선택하면 난 button
뭔가를 표시하려면 클릭하십시오. (그래서 내가 처음에 "데이터 형식"을 combo box
에서 선택하고 나서 해당 데이터 유형에 해당하는 일부 데이터를 표시하려면 button
을 누른 다음 콤보 상자에서 다른 데이터 유형을 선택하고 다시 "버튼"을 누릅니다. 그러나 이번에는 팝업 메시지 2 번, 그리고 같은 세 번째 시간을 반복 할 때 팝업 메시지 박스 3 회).
첫 번째 시도에서 콤보 상자에서 (첫 번째 시도에서) 콤보 상자를 선택한 다음 메시지 상자를 표시하기 위해 단추를 클릭하면 메시지 상자가 once.Now 응용 프로그램을 두 번째 선택 항목을 닫지 않고 팝업됩니다. 콤보 상자가 uint32
(두 번째 시도시)에 있으며이 메시지 상자가 두 번 튀어 나오는 "단추"를 다시 클릭합니다. 왜 그런지 몰라? 3 번 시도하면 3 번 팝업됩니다.
(1) 왜 메시지 상자가 반복됩니까? 사전에 도움을 주셔서 감사합니다, 나는 정말로 그 이유를 알고 싶습니다. 아직 이해할 수 없습니다.
이것은 멀티 캐스트 대리인 문제처럼 보입니다. SimpleEvent에 여러 번 'MyMethod()'를 추가해야합니다. B 클래스 생성자에 simpleEvenyt가 추가되기 전에 null이 아닌지 확인하는 이유는 무엇입니까? – KillaKem
표시된 코드는이 문제를 재현하지 않습니다. 각 이벤트에 처리기를 정확히 한 번 추가합니다. 실제 코드가 여기에 게시 한 코드와 약간 다른 것 같습니다. – Servy
우연히 클래스 레벨에서 한 번뿐 아니라 'B'라는 새로운 인스턴스를 버튼 클릭 이벤트에 인스턴스화합니까? –