2012-02-09 9 views
7

Sto lavorando a un'applicazione di moduli visivi C# piuttosto semplice ma sto riscontrando qualche problema nel far sì che la track track agisca come voglio, sperando così che qualcuno nella community potrebbe avere una soluzione per questo.Barra traccia Solo eventi di fuoco sul valore finale in qualsiasi momento.

Quello che ho è un'applicazione piuttosto semplice con la parte principale che è una barra di traccia con un valore da 0 a 100. L'utente imposta il valore della traccia per rappresentare "la quantità di lavoro da eseguire" a quel punto il il programma raggiunge alcuni dispositivi e dice loro di fare "x" quantità di lavoro (x essendo il valore della trackbar). Quindi, quello che faccio è usare le barre di scorrimento per scorrere l'evento da catturare quando il valore delle barre di traccia è cambiato e all'interno del gestore chiamare i dispositivi e dire loro quanto lavoro fare.

Il mio problema è che il gestore di eventi viene chiamato per ogni valore tra il punto in cui si trova la barra del tracciato e dove finisce. Quindi, se viene spostato da 10 a 30, il mio gestore di eventi viene chiamato 20 volte, il che significa che sto raggiungendo i miei dispositivi e dico loro di eseguire valori che non voglio nemmeno che vengano eseguiti. C'è qualche differenza solo con l'evento quando lo scroll ha smesso di funzionare, quindi puoi controllare il valore finale?

+0

Si prega di non inserire il prefisso vostri titoli con "C# di Visual Studio 2010" e così via. Ecco a cosa servono i tag. –

risposta

5

Basta controllare una variabile, se l'utente ha fatto clic sulla barra traccia. In tal caso, ritardare l'uscita.

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); 
}; 

Per il problema @roken accennato, è possibile impostare LargeChange e SmallChange a 0.

+1

Perché non solo disattivare l'evento MouseUp? Non funziona comunque solo su MouseUp? – JeffR

1

Un utente potrebbe anche spostare la barra di pista più volte in un breve periodo di tempo, oppure cliccare sul multipla pista volte per incrementare il pollice invece di trascinare il pollice. Sono tutti casi aggiuntivi in ​​cui il valore che si registra alla fine di una "mossa di pollice" non è in realtà il valore finale desiderato dall'utente.

Sembra che sia necessario un pulsante per confermare la modifica, in modo da acquisire il valore corrente della trackbar e inviarlo ai dispositivi.

0

Prova questo con il gestore trackbar_valuechanged eventi:

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

Ho trovato un modo abbastanza affidabile per farlo è quello di utilizzare un timer collegato in 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 ha avuto questo problema proprio ora che sto implementando un player video incorporato e vorrei che l'utente fosse in grado di cambiare la posizione del video ma non volevo sovraccaricare l'API di riproduzione video inviandola chiamata SetPosition per ogni tick l'utente è passato sulla sua pinna al destinazione.

Questa è la mia soluzione:

In primo luogo, i tasti freccia sono un problema. Puoi fare del tuo meglio per gestire i tasti freccia tramite un timer o qualche altro meccanismo, ma ho trovato più dolore di quanto valga. Quindi imposta la proprietà SmallChange e LargeChange su 0 come @Matthias menzionato.

Per l'input del mouse, l'utente sta per essere necessario fare clic giù, spostarlo, e lasciare andare così gestire la MouseDown, MouseUp e gli eventi di scorrimento della barra di scorrimento in questo 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

ho avuto un problema simile, solo con un controllo TrackBar della portata. La stessa idea si applica anche a questo, solo che è più facile per questo caso.

Ho gestito l'evento MouseUp sulla TrackBar per avviare le procedure necessarie, solo dopo aver rilasciato il pulsante del mouse. Funziona se trascini la barra nella posizione desiderata o semplicemente fai clic su di essa.

private void rangeTrackBarControl1_MouseUp (object sender, System.Windows.Forms.MouseEventArgs e) { YourProcedureHere(); }

2

Prova caso MouseCaptureChanged - che è la migliore per questo compito

Problemi correlati