2012-10-11 2 views
1

내 코드를보고 내가 잘못 된 곳을 알려주시겠습니까? 다음 코드에서는 Form1이 최대화 될 때 myMethod() 메서드에 알림을 보내려고합니다.대리인이 메서드를 알리지 않음

감사합니다. 여기

namespace WindowsDelegate1 
{ 

    public delegate void ChangedEventHandler(object sender, EventArgs e); 

    class myForm : Form 
    { 
     public event ChangedEventHandler Changed; 

     protected virtual void OnChanged(EventArgs e) 
     { 
      if (Changed != null) 
       Changed(this,e); 
     } 

     public override System.Drawing.Size MaximumSize 
     { 
      //get 
      //{ 
      // return base.MaximumSize; 
      //} 
      set 
      { 
       base.MaximumSize = value; 
       OnChanged(EventArgs.Empty); 
      } 
     } 
    } 
} 


namespace WindowsDelegate1 
{ 
    class EventListener 
    { 
     private myForm TheForm; 

     public EventListener(myForm theform) 
     { 
      TheForm = theform; 
      TheForm.Changed += new ChangedEventHandler(myMethod); 
     } 

     private void myMethod(object sender, EventArgs e) 
     { 
      MessageBox.Show("hey, window should be maximized now!"); 
     } 

     public void Detach() 
     { 
      TheForm.Changed -= new ChangedEventHandler(myMethod); 
      TheForm = null; 
     } 
    } 
} 

아마 이벤트가 당신의 .Detach() 전화 후 해고하거나, 전혀 해고되지 않습니다입니다 무슨 일 테스트 장치/또는 주()

namespace WindowsDelegate1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      myForm f = new myForm(); 
      EventListener listener = new EventListener(f); 
      f.ShowDialog(); 
      f.WindowState = FormWindowState.Maximized; 
      listener.Detach(); 

     } 
    } 
} 
+0

위 내 소스 코드를 업데이트 한

protected override void OnActivated(EventArgs e) { base.OnActivated(e); OnChanged(EventArgs.Empty); } 

내 실수라고 생각 :

나는 (내가 그걸! 사용 왜 생각을) 속성을 제거하여 대신 방법을 사용하여 고정 왜냐하면 나는 Form 클래스의 프라퍼티 대신에 프라퍼티를 사용했기 때문입니다. –

+0

간단한 설명뿐입니다. 답을 얻은 후에는 질문을 편집하지 마십시오. 질문을 그대로두고 아래 섹션에 답변을 넣어주십시오. 그러면 미래의 독자는 무엇에 대해 혼란스러워하지 않습니까? 원래의 문제가있었습니다. – ean5533

답변

0

아이디어를 공유해 주셔서 감사합니다. 내가 너무

1

입니다. 나는 listener.Detach() 호출을 제거함으로써 시작할 것입니다. 일반적으로 양식을 만들 때 또는 언로드 할 때로드되고 분리 될 때 이벤트에 연결합니다.

이외의 경우 Detach 메서드는 추가 된 것과 다른 ChangedEventHandler 인스턴스를 제거하려고하기 때문에 문제가 발생합니다. ChangedEventHandler에 메서드를 래핑하는 경우 추가 한 인스턴스를 저장해야합니다.

+0

좋은 조언을 드리겠습니다. 감사. –

관련 문제