Pergunta

É possível em qualquer conjunto de circunstâncias para ser capaz de fazer isso?

As minhas circunstâncias atuais são o seguinte:

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.
    }
}

Meu primeiro pensamento foi para ter uma função semelhante a:

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
    }
}

É um remendo horrivelmente feia, mas ele deve funcionar ... Deve haver uma solução mais elegante embora? A biblioteca .NET faz isso o tempo todo com manipuladores de mensagem e chamando eventos no controle de. Alguém tem quaisquer outras idéias melhores /?

Foi útil?

Solução

Você só precisa adicionar um método público para invocar o evento. Microsoft já faz isso para alguns eventos, como PerformClick para controles que expõem um Clique evento.

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

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

Você, então, fazer o seguinte dentro do seu exemplo evento manipulador ...

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

Outras dicas

A palavra-chave evento em c # modifica a declaração do delegado. Ela impede atribuição direta ao delegado (você só pode usar + = e - = em um evento)., Que impede a invocação do delegado de fora da classe

Assim, você poderá alterar seu código para algo como isto:

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

Em seguida, você pode chamar o evento de fora da classe como este.

myCustomGUIElement.Click(sender,args);

A desvantagem é que o código usando a classe pode substituir quaisquer manipuladores registrados muito facilmente com um código como este:

myCustomGUIElement.Click = null;

que não é permitido se o clique delegado é declarado como um evento.

Você realmente deve envolver o código que você deseja ser capaz de executar de fora para dentro de um método. Esse método pode, então, fazer o seu evento faria -. E aquele evento também em vez chamar esse método

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top