Pergunta

Contexto:

Há uma aplicação onde você desenhar coisas na tela. Onde o usuário clica há um ponto preto, por exemplo. Mas a manipulação que os eventos gerados por tela em manipuladores de eventos no código janela principal é apenas feio para mim. Então eu escrevi uma classe que métodos espelhar eventos do mouse lona e eu chamar esses métodos dentro de manipulador de eventos.

public partial class Window1 : Window
{
    DrawingTool drawTool = new DrawingTool();
    public Window1()
    {
        InitializeComponent();            
    }

    private void drawingCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        drawTool.OnMouseLeftButtonDown(e);
    }
}

Nice, mas eu quero mais ...

Pergunta:

É possível lidar com eventos gerados pela lona na minha classe DrawingTool diretamente sem ter manipuladores de eventos de lona definidos. Eu gostaria de manter meu código Window1 limpo e focado em coisas janela e eventos de movimentação de manipulação completamente em minhas classes.

Eu pensei sobre a derivação DrawingTool de FrameworkElement, substituir OnRender e desenhá-la de forma transparente sobre a tela de modo de clique do usuário parecia ser feita sobre tela, mas na verdade seria levantado em DrawingTool e tratado internamente. Essa abordagem funciona com o desenho funcionalidade (depois de desenho é feito objeto desenhado é adicionado às crianças de lona e removido crianças DrawingTool), mas quando se trata de modo de seleção ou outros, existem problemas com testes hit de elementos, por exemplo.

Então, eu vou ser grato por qualquer sugestão de como resolver o meu problema ou explicação por que isso é uma idéia estúpida em tudo:)

Foi útil?

Solução

Apenas expor os campos de controlo privados como propriedades públicas e quando você tem uma instância de Window1 você pode apenas fazer

Window1.DrawingCanvas.MouseLeftButtonDown += YourHandlerMethod;

Outras dicas

Eu não tenho certeza se eu tenho o problema certo, e eu só joguei com WPF um pouco, mas como sobre a criação de um controle de usuário que contém a sua tela e manusear o mouse eo desenho lá? Isso poderia ser chamado DrawingControl ou similar.

Dessa forma, você seria capaz de ter o código de desenho contido na classe que representa o controle. Você pode querer dar o novo controle de usuário uma propriedade que permite o acesso para a tela "interno".

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