Mi pregunta es doble, y espero que haya soluciones más fáciles para ambas proporcionadas por WPF en lugar de las soluciones estándar de WinForms (que proporcionó Christophe Geers, antes de hacer esta aclaración).
Primero, ¿hay alguna manera de hacer que Window se pueda arrastrar sin capturar y procesar los eventos de clic del mouse + arrastrar? Me refiero a que la ventana se puede arrastrar por la barra de título, pero si configuro una ventana para que no tenga una y aún así quiero poder arrastrarla, ¿hay alguna manera de redirigir los eventos de alguna manera a lo que sea que maneje la barra de título arrastrando? ?
En segundo lugar, ¿hay alguna forma de aplicar un controlador de eventos a todos los elementos de la ventana? Al igual que en, haga que la ventana se pueda arrastrar sin importar en qué elemento haga clic + arrastre el usuario. Obviamente, sin agregar el controlador manualmente, a cada elemento. ¿Solo hacerlo una vez en algún lugar?
fuente
MouseLeftButtonDown
evento en lugar de registrar el .cs?MouseLeftButtonDown
tiene una estrategia de enrutamiento directo mientras queMouseDown
tiene una estrategia de enrutamiento burbujeante. Consulte la sección de comentarios de la página de MSDN para MouseLeftButtonDown para obtener más información y algunas cosas adicionales que debe tener en cuenta si va a usarMouseLeftButtonDown
overMouseDown
.si el formulario wpf debe poder arrastrarse sin importar dónde se haya hecho clic, la solución fácil es usar un delegado para activar el método DragMove () en el evento de carga de Windows o en el evento de carga de la cuadrícula
fuente
DragMove
solo se puede llamar cuando el botón principal del mouse está presionado.A veces, no tenemos acceso a
Window
, por ejemplo, si estamos usandoDevExpress
, todo lo que está disponible es unUIElement
.Paso 1: agregar propiedad adjunta
La solucion es:
MouseMove
eventos;Window
;.DragMove()
a nuestro recién descubiertoWindow
.Código:
Paso 2: agregue la propiedad adjunta a cualquier elemento para permitir que arrastre la ventana
El usuario puede arrastrar toda la ventana haciendo clic en un elemento específico, si agregamos esta propiedad adjunta:
Apéndice A: Ejemplo avanzado opcional
En este ejemplo de DevExpress , reemplazamos la barra de título de una ventana de acoplamiento con nuestro propio rectángulo gris, luego nos aseguramos de que si el usuario hace clic y arrastra dicho rectángulo gris, la ventana se arrastrará normalmente:
Exención de responsabilidad: estoy no afiliado con DevExpress . Esta técnica funcionará con cualquier elemento de usuario, incluido el estándar WPF o Telerik (otro excelente proveedor de bibliotecas de WPF).
fuente
Está lanzando una excepción en algunos casos (es decir, si en la ventana también tiene una imagen en la que se puede hacer clic, que cuando se hace clic se abre un cuadro de mensaje. Cuando salga del cuadro de mensaje, obtendrá un error) Es más seguro de usar
Así que está seguro de que el botón izquierdo está presionado en ese momento.
fuente
e.LeftButton
lugar deMouse.LeftButton
usar específicamente el botón asociado con los argumentos del evento, aunque probablemente nunca importe.Es posible arrastrar y soltar un formulario haciendo clic en cualquier parte del formulario, no solo en la barra de título. Esto es útil si tiene un formulario sin bordes.
Este artículo sobre CodeProject demuestra una posible solución para implementar esto:
http://www.codeproject.com/KB/cs/DraggableForm.aspx
Básicamente, se crea un descendiente del tipo Form en el que se manejan los eventos de mouse hacia abajo, arriba y mover.
Y aquí hay una solución similar explicada en un video tutorial:
http://www.youtube.com/watch?v=tJlY9aX73Vs
No permitiría arrastrar el formulario cuando un usuario haga clic en un control en dicho formulario. Los usuarios obtienen diferentes resultados cuando hacen clic en diferentes controles. Cuando mi formulario de repente comienza a moverse porque hice clic en un cuadro de lista, un botón, una etiqueta, etc. eso sería confuso.
fuente
Como ya lo mencionó @ fjch1997 , es conveniente implementar un comportamiento. Aquí está, la lógica central es la misma que en la respuesta de @ loi.efy :
Uso:
fuente
¡Todo esto es necesario!
fuente
El método más útil, tanto para WPF como para Windows, ejemplo de WPF:
fuente
fuente
fuente