2012-06-07 2 views
2

런타임시 컨트롤의 이동을 허용하는 미리 만든 도우미 파일에서 발견 된 일부 익명의 대리자 이벤트의 구독을 취소하는 방법을 파악하는 데 문제가 있습니다. 이러한 이벤트를 구독 취소하려는 이유는 컨트롤 (이 경우 버튼)이 다시 잠기고 이동할 수 없기 때문입니다. 여기 헬퍼 클래스의 방법입니다 :익명 대리자 이벤트 구독 취소

public static void Init(Control control) 
    { 
     Init(control, Direction.Any); 
    } 

    public static void Init(Control control, Direction direction) 
    { 
     Init(control, control, direction); 
    } 

public static void Init(Control control, Control container, Direction direction) 
    { 
     bool Dragging = false; 
     Point DragStart = Point.Empty; 

     control.MouseDown += delegate(object sender, MouseEventArgs e) 
     { 
      Dragging = true; 
      DragStart = new Point(e.X, e.Y); 
      control.Capture = true; 
     }; 
     control.MouseUp += delegate(object sender, MouseEventArgs e) 
     { 
      Dragging = false; 
      control.Capture = false; 
     }; 
     control.MouseMove += delegate(object sender, MouseEventArgs e) 
     { 
      if (Dragging) 
      { 
       if (direction != Direction.Vertical) 
        container.Left = Math.Max(0, e.X + container.Left - DragStart.X); 
       if (direction != Direction.Horizontal) 
        container.Top = Math.Max(0, e.Y + container.Top - DragStart.Y); 
      } 
     }; 

    } 

는 여기에 내가 메서드를 호출하여 이러한 이벤트를 구독하는 방법은;

ControlMover.Init(this.Controls["btn" + i]); 

나는이 방법을 통해 탈퇴 후이 행사를 지역 변수를 생성하고 이러한에게 구독 취소에 대해 MSDN에 대한 몇 가지 방법에 대해 읽었습니다,하지만 난 내 자신의 프로젝트에서이 작업을 얻을 수 없습니다. 내 컨트롤이 다시 고정되도록 이러한 이벤트에 대한 가입을 취소하려면 어떻게해야합니까?

+0

코드를 변수에 저장하고이를 사용하여 코드를 등록 취소 할 수 있습니까? – CodesInChaos

+1

하지만 개인적으로 나는 이것을 위해 명명 된 방법을 사용하고 싶습니다. 더 쉽고 깨끗한 코드 IMO. – CodesInChaos

+0

원격으로 작업을 수행 할 수 없기 때문에이 파일을 제거했습니다. 나는 그것 위에서 약간 또는 더 한층의 작업을 시도하려고 노력할 것이다. 그러나 그것은 좋게 보이지 않고 있었다! –

답변

5

익명 대리자는 동일한 코드의 고유성 부족을 구독 취소하면 올바른 처리기의 구독을 취소하지 못하게되므로 컴파일러에서 생성 된 것처럼 고유하지 않을 수 있습니다. 이렇게 안전하게하는 유일한 방법은 대리인에 대한 참조를 유지하고이를 사용하여 구독을 취소하거나 전체 방법으로 변경하는 것입니다.

대리인은 내가 믿는 개체 인스턴스 및 메서드 서명을 기준으로 동일합니다.

가능한 중복 :

기본적으로

How to remove a lambda event handler

는, 참조를 유지 :

MouseEventHandler handler = (sender, e) => 
     { 
      Dragging = true; 
      DragStart = new Point(e.X, e.Y); 
      control.Capture = true; 
     }; 

control.MouseDown += handler; 
control.MouseDown -= handler; 

또는 적당한 방법으로 익명의 방법을 설정합니다.

+0

귀하의 입력에 대 한 환호. 나는 장기적으로 일을 쉽게하기 위해서 적절한 방법으로 그들을 돌릴 것이라고 생각합니다. –

+0

@ Shane'Shamus'Coulter 나는 또한 당신의 등록 코드를 조금 더 깨끗하게 만들 것이다 :'control.MouseDown + = MouseDownHandler; ' –

+0

그래서 나는 실제로 그것들을 모든 메소드들로 인해 적절한 메소드로 만드는 데 어려움을 겪고있다. 클래스의 매개 변수를 전달합니다. –

0

요약하면 anonymous 대리인으로는 할 수 없습니다.

이벤트에서 개최되는 수신 거부을 원하는 경우 delegate/action을 정의하고 참조하는 패턴을 따르십시오.