2011-06-22 51 views
8

¿Cómo realizo una acción repetidamente cuando se presiona el botón izquierdo del mouse y se mantiene presionado en WPF?WPF: botón izquierdo del mouse, haga clic y mantenga presionado el control

El siguiente controlador de eventos para el evento UIElement.PreviewMouseLeftButtonDown no hacer el trabajo:

private void BaseButtonRight_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 
     { 
      // keep performing action while mouse left button is pressed. 
      // Checking e.ButtonState works only for one click 

     } 

ejecución ni siquiera entrar en el bucle while y gestor se llama cuando se suelta el botón izquierdo del ratón!

Respuesta

17
+1

Esta debería ser la respuesta aceptada. – GONeale

+0

@GONeale, a menos que el OP no esté usando un botón ... Tengo el mismo problema y no hago clic en un botón, por lo que esta respuesta no me sirve. Usaré la respuesta del hilo de fondo. Pero sí, el OP debería seleccionar una respuesta o publicar su propia respuesta y seleccionar esa. – CramerTV

+0

Niño, olvídate del contexto bajo el cual se hizo la pregunta, pero aceptará esta respuesta. –

0

Ejecute un subproceso hasta que se active MouseLeftButtonUp.

+0

necesito para manipular la interfaz de usuario. Ver comentarios a continuación. –

1

Inicie un BackroundWorker que sale cuando el mouse ha sido liberado. Establezca un indicador con el evento de mouse arriba y también verifique periódicamente en la función BackgroundWorker DoWork. Asegúrate de usar el bloqueo {} para acceder a la bandera.

Editar: en caso de que quiera acceder a algo en el hilo de interfaz de usuario, utilice Dispatcher.BeginInvoke, por ejemplo:

Dispatcher.BeginInvoke(new ThreadStart(delegate 
{ 
    ComboBoxItem selItem = ComboboxConnectString.SelectedItem as ComboBoxItem; 
    if (selItem != null && selItem.Tag is string) 
     ComboboxConnectString.Text = (string)selItem.Tag; 
})); 
+0

El trabajo que hay que hacer implica manipular con RenderTransform de un elemento de UI. Usar un BackgroundWorker se ve desafiante ... BackgroundWorker.DoWork básicamente duerme, pero si me reúno con el hilo de UI, ¿cómo vuelvo a llamar a BackgroundWorker.DoWork? –

+0

Cuando desee volver a llamar en el hilo de la interfaz de usuario para modificar RenderTransform, hágalo con Dispatcher.BeginInvoke (edité mi publicación para incluir una muestra). La modificación se ejecutará en el subproceso de la interfaz de usuario mientras continúa en bucle. Este es el mismo método que todos utilizan para realizar una acción de fondo mientras se actualiza una barra de progreso. –

Cuestiones relacionadas