Minha pergunta é dupla, e espero que haja soluções mais fáceis para ambas fornecidas pelo WPF, em vez das soluções padrão do WinForms (que Christophe Geers forneceu, antes de eu fazer este esclarecimento).
Primeiro, há uma maneira de tornar a janela arrastável sem capturar e processar eventos de clique do mouse + arrastar? Quer dizer, a janela pode ser arrastada pela barra de título, mas se eu definir uma janela para não ter uma e ainda quiser ser capaz de arrastá-la, há uma maneira de redirecionar os eventos de alguma forma para o que quer que lide com o arrasto da barra de título ?
Em segundo lugar, existe uma maneira de aplicar um manipulador de eventos a todos os elementos da janela? Como em, torne a janela arrastável independentemente do elemento que o usuário clicar e arrastar. Obviamente, sem adicionar o manipulador manualmente, a cada elemento. Basta fazer isso uma vez em algum lugar?
fonte
MouseLeftButtonDown
evento, em vez de fazer check-in no .cs?MouseLeftButtonDown
tem uma estratégia de roteamento direto enquantoMouseDown
tem uma estratégia de roteamento borbulhante. Consulte a seção de comentários da página do MSDN para MouseLeftButtonDown para obter mais informações e para algumas coisas extras que você deve saber se for usarMouseLeftButtonDown
overMouseDown
.se o formulário wpf precisa ser arrastado, não importa onde foi clicado, a solução mais fácil é usar um delegado para acionar o método DragMove () no evento Windows onload ou no evento de carregamento da grade
fonte
DragMove
só pode ser chamado quando o botão principal do mouse está pressionado.Às vezes, não temos acesso a
Window
, por exemplo, se estivermos usandoDevExpress
, tudo o que está disponível é umUIElement
.Etapa 1: Adicionar propriedade anexada
A solução é:
MouseMove
eventos;Window
;.DragMove()
para o nosso recém-descobertoWindow
.Código:
Etapa 2: adicione propriedade anexada a qualquer elemento para permitir que ele arraste a janela
O usuário pode arrastar a janela inteira clicando em um elemento específico, se adicionarmos esta propriedade anexada:
Apêndice A: Exemplo avançado opcional
Neste exemplo do DevExpress , substituímos a barra de título de uma janela de encaixe por nosso próprio retângulo cinza e garantimos que, se o usuário clicar e arrastar o retângulo cinza, a janela se arrastará normalmente:
Disclaimer: Eu estou não afiliado com DevExpress . Esta técnica funcionará com qualquer elemento do usuário, incluindo WPF padrão ou Telerik (outro excelente provedor de biblioteca WPF).
fonte
Está gerando uma exceção em alguns casos (por exemplo, se na janela você também tiver uma imagem clicável que, ao ser clicada, abrirá uma caixa de mensagem. Quando você sair da caixa de mensagem, receberá um erro) É mais seguro usar
Portanto, você tem certeza de que o botão esquerdo foi pressionado naquele momento.
fonte
e.LeftButton
vez deMouse.LeftButton
para usar especificamente o botão associado aos argumentos do evento, embora isso provavelmente nunca importe.É possível arrastar e soltar um formulário clicando em qualquer lugar no formulário, não apenas na barra de título. Isso é útil se você tiver um formulário sem borda.
Este artigo sobre CodeProject demonstra uma solução possível para implementar isso:
http://www.codeproject.com/KB/cs/DraggableForm.aspx
Basicamente, um descendente do tipo Form é criado, no qual os eventos para cima, para baixo e para baixo do mouse são manipulados.
E aqui está uma solução semelhante explicada em um tutorial em vídeo:
http://www.youtube.com/watch?v=tJlY9aX73Vs
Eu não permitiria arrastar o formulário quando um usuário clicar em um controle nesse formulário. Os usuários obtêm resultados diferentes quando clicam em controles diferentes. Quando meu formulário começa a se mover repentinamente porque cliquei em uma caixa de listagem, botão, rótulo ... etc. isso seria confuso.
fonte
Como já mencionado por @ fjch1997 , é conveniente implementar um comportamento. Aqui está, a lógica central é a mesma da resposta de @ loi.efy :
Uso:
fonte
Tudo isso é necessário!
fonte
O método mais útil, tanto para WPF quanto para Windows Form, exemplo de WPF:
fonte
fonte
fonte