2012-02-09 12 views
7

Estoy trabajando en una aplicación de formularios de estudio visual C# bastante básica pero tengo problemas para hacer que la barra de seguimiento actúe como yo quiero esperando que alguien en la comunidad podría tener una solución para esto.Barra de seguimiento Solo evento de fuego en valor final no cambia el valor de tiempo

Lo que tengo es una aplicación bastante básica, siendo la parte principal una barra de seguimiento con un valor de 0 a 100. El usuario establece el valor de la pista para representar "la cantidad de trabajo a realizar", en cuyo el programa llega a algunos dispositivos y les dice que hagan una "x" cantidad de trabajo (x es el valor de la barra de seguimiento). Entonces, lo que hago es usar el evento de desplazamiento de barras de seguimiento para capturar cuando el valor de las barras de seguimiento ha cambiado y dentro del controlador llamar a los dispositivos y les dice cuánto trabajo hacer.

Mi problema es que se llama a mi controlador de eventos para cada valor entre el lugar donde reside la barra de seguimiento y donde sea que termine. Entonces, si se desliza de 10 a 30, mi controlador de eventos se llama 20 veces, lo que significa que estoy llegando a mis dispositivos y les digo que ejecuten valores que ni siquiera quiero que ejecuten. ¿Existe algún evento solo cuando el desplazamiento ha dejado de suceder para que pueda verificar el valor final?

+0

Por favor, no anteponer sus títulos con "C# Visual Studio 2010" y tal. Para eso son las etiquetas. –

Respuesta

5

Simplemente marque una variable, si el usuario hizo clic en la barra de seguimiento. Si es así, retrasa la salida.

bool clicked = false; 
trackBar1.Scroll += (s, 
         e) => 
{ 
    if (clicked) 
     return; 
    Console.WriteLine(trackBar1.Value); 
}; 
trackBar1.MouseDown += (s, 
         e) => 
{ 
    clicked = true; 
}; 
trackBar1.MouseUp += (s, 
         e) => 
{ 
    if (!clicked) 
     return; 

    clicked = false; 
    Console.WriteLine(trackBar1.Value); 
}; 

Para el problema @roken mencionado, se puede establecer LargeChange y SmallChange a 0.

+1

¿Por qué no simplemente desactiva el evento MouseUp? ¿Esto no se dispara solo en MouseUp de todos modos? – JeffR

1

Un usuario también podría mover la barra de pistas múltiples veces en un corto período de tiempo, o haga clic en la pista de múltiples veces para incrementar el pulgar en lugar de arrastrar el pulgar. Todos son casos adicionales en los que el valor que se registra al final de un "movimiento de pulgar" no es realmente el valor final que su usuario desea.

Parece que necesita un botón para confirmar el cambio, que luego capturaría el valor actual de la barra de seguimiento y lo enviaría a sus dispositivos.

0

Intente esto con el manejador de eventos trackbar_valuechanged:

trackbar_valuechanged(s,e) { 
    if(trackbar.value == 10){ 
     //Do whatever you want 
    } else{ 
     //Do nothing or something else 
    } 
} 
1

he encontrado una manera bastante fiable de hacerlo es utilizar un temporizador conectado en caso trackbar.Scroll:

private Timer _scrollingTimer = null; 

private void trackbar_Scroll(object sender, EventArgs e) 
{ 
    if (_scrollingTimer == null) 
    { 
     // Will tick every 500ms (change as required) 
     _scrollingTimer = new Timer() 
     { 
       Enabled = false, 
       Interval = 500, 
       Tag = (sender as TrackBar).Value 
     }; 
     _scrollingTimer.Tick += (s, ea) => 
     { 
      // check to see if the value has changed since we last ticked 
      if (trackBar.Value == (int)_scrollingTimer.Tag) 
      { 
       // scrolling has stopped so we are good to go ahead and do stuff 
       _scrollingTimer.Stop(); 

       // Do Stuff Here . . . 

       _scrollingTimer.Dispose(); 
       _scrollingTimer = null; 
      } 
      else 
      { 
       // record the last value seen 
       _scrollingTimer.Tag = trackBar.Value; 
      } 
     }; 
     _scrollingTimer.Start(); 
    } 
} 
0

I tuve este problema justo ahora cuando estoy implementando un reproductor de video integrado y me gustaría que el usuario pueda cambiar la posición del video, pero no quería sobrecargar la API de reproducción de video enviándole llamadas SetPosition para cada tic el usuario pasó en el camino hacia su aleta al destino.

Esta es mi solución:

En primer lugar, las teclas de flecha son un problema. Puede hacer todo lo posible para manejar las teclas de flecha a través de un temporizador u otro mecanismo, pero me pareció más doloroso de lo que vale. Por lo tanto, establezca la propiedad SmallChange y LargeChange en 0 como mencionó @Matthias.

Para la entrada del ratón, el usuario va a tener que hacer clic abajo, moverlo, y dejar ir tan manejar el MouseDown, MouseUp y los eventos de desplazamiento de la barra de seguimiento de este modo:

private bool trackbarMouseDown = false; 
    private bool trackbarScrolling = false; 

    private void trackbarCurrentPosition_Scroll(object sender, EventArgs e) 
    { 
     trackbarScrolling = true; 
    } 

    private void trackbarCurrentPosition_MouseUp(object sender, MouseEventArgs e) 
    { 
     if (trackbarMouseDown == true && trackbarScrolling == true) 
      Playback.SetPosition(trackbarCurrentPosition.Value); 
     trackbarMouseDown = false; 
     trackbarScrolling = false; 
    } 

    private void trackbarCurrentPosition_MouseDown(object sender, MouseEventArgs e) 
    { 
     trackbarMouseDown = true; 
    } 
0

que tenían un problema similar, solo con un rango TrackBar Control. La misma idea se aplica a esto también, solo que es más fácil para este caso.

Manejé el evento MouseUp en la Barra de seguimiento para iniciar los procedimientos que necesitaba, solo después de soltar el botón del mouse. Esto funciona si arrastra la barra a la posición deseada o simplemente hace clic.

vacío rangeTrackBarControl1_MouseUp (remitente del objeto, System.Windows.Forms.MouseEventArgs e) privada { YourProcedureHere(); }

2

Prueba el caso MouseCaptureChanged - que es el mejor para esta tarea

Cuestiones relacionadas