문제

어떤 상황에서도 이것을 달성하는 것이 가능합니까?

나의 현재 상황은 이렇습니다.

public class CustomForm : Form
{
    public class CustomGUIElement
    {
    ...
        public event MouseEventHandler Click;
        // etc, and so forth.
    ...
    }

    private List<CustomGUIElement> _elements;

    ...

    public void CustomForm_Click(object sender, MouseEventArgs e)
    {
        // we might want to call one of the _elements[n].Click in here
        // but we can't because we aren't in the same class.
    }
}

내 첫 번째 생각은 다음과 유사한 기능을 갖는 것이 었습니다.

internal enum GUIElementHandlers { Click, ... }
internal void CustomGUIElement::CallHandler(GUIElementHandler h, object[] args) {
    switch (h) {
        case Click:
            this.Click(this, (EventArgs)args[0]);
            break;
        ... // etc and so forth
    }
}

끔찍하게 못생긴 덩어리이지만 작동해야합니다 ...하지만 좀 더 우아한 해결책이 있어야 할까요?.NET 라이브러리는 메시지 처리기와 컨트롤의 이벤트 호출을 통해 항상 이 작업을 수행합니다.다른 사람이 다른/더 나은 아이디어를 갖고 있나요?

도움이 되었습니까?

해결책

이벤트를 호출하기 위한 공개 메소드를 추가하기만 하면 됩니다.Microsoft는 다음과 같은 일부 이벤트에 대해 이미 이 작업을 수행하고 있습니다. 수행클릭 노출하는 컨트롤의 경우 딸깍 하는 소리 이벤트.

public class CustomGUIElement    
{
    public void PerformClick()
    {
        OnClick(EventArgs.Empty);
    }

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

그런 다음 예제 이벤트 핸들러 내에서 다음을 수행합니다.

public void CustomForm_Click(object sender, MouseEventArgs e)        
{
    _elements[0].PerformClick();
}

다른 팁

C#의 이벤트 키워드는 대리자의 선언을 수정합니다.이는 대리자에 대한 직접 할당을 방지하고(이벤트에서는 += 및 -=만 사용할 수 있음) 클래스 외부에서 대리자를 호출하는 것을 방지합니다.

따라서 코드를 다음과 같이 변경할 수 있습니다.

public class CustomGUIElement
{
...
    public MouseEventHandler Click;
    // etc, and so forth.
...
}

그런 다음 이와 같이 클래스 외부에서 이벤트를 호출할 수 있습니다.

myCustomGUIElement.Click(sender,args);

단점은 클래스를 사용하는 코드가 다음과 같은 코드로 등록된 처리기를 매우 쉽게 덮어쓸 수 있다는 것입니다.

myCustomGUIElement.Click = null;

Click 대리자가 이벤트로 선언된 경우에는 허용되지 않습니다.

실제로 외부에서 실행할 수 있는 코드를 메서드로 래핑해야 합니다.그러면 해당 메서드는 이벤트가 수행하는 모든 작업을 수행할 수 있으며 해당 이벤트는 대신 해당 메서드를 호출합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top