Je travaille sur une application de formulaires Visual Studio Visual Studio Visual de base, mais j'ai une question d'obtenir la barre de piste d'agir comme je le souhaite, en espérant que quelqu'un dans la communauté pourrait avoir une solution pour cela. p>
Ce que j'ai est une application assez basique avec la partie principale étant une barre de piste d'une valeur de 0 à 100. L'utilisateur définit la valeur de la piste pour représenter "la quantité de travail à effectuer" à quel point le programme Atteint à certains appareils et leur dit de faire "x" quantité de travail (x étant la valeur de la barre de capture). Donc, ce que je fais est d'utiliser l'événement de défilement des barres de piste pour attraper lorsque la valeur des barres de piste a changé et à l'intérieur du gestionnaire appelez les appareils et leur indique à quel point le travail de faire. P>
Mon problème est que mon gestionnaire d'événements est appelé à chaque valeur entre l'endroit où réside actuellement la barre de piste et où elle se termine. Donc, si elle est glissée de 10 à 30, mon gestionnaire d'événements est appelé 20 fois ce que signifie que je prends la main sur mes appareils et que je leur dise de courir à des valeurs, je ne veux même pas qu'ils courent. S'agit-il de ce faire uniquement à l'événement lorsque le défilement a cessé de se produire afin que vous puissiez vérifier la valeur finale? P>
8 Réponses :
Vérifiez simplement une variable si l'utilisateur a cliqué sur la barre de piste. Si tel est le cas, retardez la sortie.
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); };
Pourquoi pas seulement la clé de l'événement MouseUp? Est-ce que cela ne tire-t-il que sur MouseUp de toute façon?
Un utilisateur peut également déplacer la barre de piste à plusieurs reprises dans une courte période de temps ou cliquer sur la piste plusieurs fois pour incrémenter le pouce au lieu de glisser le pouce. Tous étant des cas supplémentaires dans lesquels la valeur qui s'enregistre à la fin d'un «mouvement du pouce» n'est pas vraiment la valeur finale de votre utilisateur souhaite. P>
On dirait que vous avez besoin d'un bouton pour confirmer la modification, ce qui capturerait ensuite la valeur actuelle de la barre de capture et l'envoyer à vos appareils. P>
Essayez ceci avec le Trackbar_Valuchanged CODE> Gestionnaire d'événements:
trackbar_valuechanged(s,e) {
if(trackbar.value == 10){
//Do whatever you want
} else{
//Do nothing or something else
}
}
J'ai trouvé un moyen assez fiable de le faire consiste à utiliser une minuterie connectée dans l'événement 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(); } }
J'ai eu ce problème juste que je mettant en œuvre un lecteur vidéo intégré et que j'aimerais que l'utilisateur puisse changer la position de la vidéo, mais je ne voulais pas surcharger l'API de lecture vidéo en envoyant une séparation informatique Appelle à chaque coche que l'utilisateur a transmis sur le chemin de sa destination finale.
Ceci est ma solution: P>
Premièrement, les touches fléchées sont un problème. Vous pouvez faire de votre mieux pour gérer les touches fléchées via une minuterie ou un autre mécanisme, mais je l'ai trouvé plus de douleur qu'elle ne vaut la peine. Donc, définissez la propriété Smallchange et Largechange à 0 @ @matthias mentionné. p>
pour la saisie de la souris, l'utilisateur va avoir à cliquer sur le bas, le déplacer et laisser aller alors gérer la MouseDown, MouseUp et les événements de défilement de la barre de suivi, comme: P>
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; }
J'ai eu un problème similaire, uniquement avec un contrôle de la barre de piste de plage. Même idée s'applique également à cela, seulement il est plus facile pour cette affaire. P>
J'ai géré l'événement de la MouseUp sur la barre de trousse pour lancer les procédures dont j'avais besoin, seulement après avoir laissé tomber le bouton de la souris. Cela fonctionne si vous faites glisser la barre vers votre position souhaitée ou simplement cliquez dessus. P>
Void privé RangeTrackBarControl1_MouseUp (expéditeur d'objet, system.windows.forms.mouseeventargs e) { YourProcoDureHere (); } p>
Essayez le MOUSECAPTEURCHANGED code> Evénement - c'est le meilleur pour cette tâche p>
J'ai résolu le problème de mon application avec deux événements:
public MainWindow() { //Event for new Trackbar-Value trackbar.ValueChanged += new System.EventHandler(trackbar_ValueChanged); } private void trackbar_ValueChanged(object sender, EventArgs e) { //enable Trackbar Mouse-ButtonUp-Event trackbar.MouseUp += ch1_slider_MouseUp; //disable Trackbar-ValueChange-Event trackbar.ValueChanged -= ch1_slider_ValueChanged; } private void trackbar_MouseUp(object sender, EventArgs e) { //enable Trackbar-ValueChange-Event again trackbar.ValueChanged += new System.EventHandler(trackbar_ValueChanged); //disable Mouse-ButtonUp-Event trackbar.MouseUp -= trackbar_MouseUp; //This is the final trackbar-value textBox.AppendText(trackbar.Value); }
Veuillez ne pas préfixer vos titres avec "C # Visual Studio 2010" et tels. C'est ce que les tags sont pour.