Трек-бар Только событие события на окончательном значении, но не когда время изменяется - PullRequest
7 голосов
/ 10 февраля 2012

Я работаю над довольно простым приложением для визуальных студий на C #, но у меня возникли проблемы с тем, чтобы заставить трек-бар действовать так, как я хочу, и надеюсь, что кто-то в сообществе найдет решение для этого.

То, что у меня есть, является довольно простым приложением, основная часть которого представляет собой панель треков со значением от 0 до 100. Пользователь устанавливает значение трека для представления «объема работы, которую необходимо выполнить», в какой момент программа тянется к некоторым устройствам и говорит им выполнить «х» объем работы (х является значением трекбара). Поэтому я использую событие прокрутки панели треков, чтобы поймать, когда значение треков полосы изменилось, и внутри обработчика вызвать устройства и сообщить им, сколько работы предстоит сделать.

Моя проблема в том, что мой обработчик событий вызывается для каждого значения между тем, где в данный момент находится трек-бар, и тем, где он заканчивается. Так что, если он уменьшен с 10 до 30, мой обработчик событий вызывается 20 раз, что означает, что я обращаюсь к своим устройствам и говорю им, чтобы они работали со значениями, при которых я даже не хочу, чтобы они работали. Есть ли какое-то событие, когда прокрутка прекратилась, и вы можете проверить окончательное значение?

Ответы [ 7 ]

5 голосов
/ 10 февраля 2012

Просто проверьте переменную, если пользователь нажал на трекбар.Если это так, задержите вывод.

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

Для упомянутой проблемы @roken можно установить LargeChange и SmallChange в 0.

2 голосов
/ 05 сентября 2016

Попробуйте событие MouseCaptureChanged - это лучшее для этой задачи

1 голос
/ 28 марта 2013

Я нашел довольно надежный способ сделать это, используя таймер, подключенный к трекбару. Событие 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();
    }
}
1 голос
/ 10 февраля 2012

Пользователь также может перемещать панель треков несколько раз за короткий промежуток времени или нажимать на трек несколько раз, чтобы увеличивать большой палец вместо того, чтобы перетаскивать большой палец. Все это дополнительные случаи, когда значение, которое регистрируется в конце «движения пальца», на самом деле не является конечным значением, которое желает ваш пользователь.

Звучит так, как будто вам нужна кнопка для подтверждения изменения, которая затем захватит текущее значение трекбара и отправит его на ваши устройства.

0 голосов
/ 04 декабря 2014

У меня была похожая проблема, только с диапазоном TrackBar Control. Та же идея применима и к этому, только в этом случае это проще.

Я обработал событие MouseUp на TrackBar, чтобы запустить нужные мне процедуры, только после того, как вы отпустите кнопку мыши. Это работает, если вы перетаскиваете панель в нужное положение или просто щелкаете по ней.

private void rangeTrackBarControl1_MouseUp (отправитель объекта, System.Windows.Forms.MouseEventArgs e) { YourProcedureHere (); }

0 голосов
/ 22 апреля 2013

У меня была эта проблема только сейчас, когда я внедряю встроенный видеоплеер и хотел бы, чтобы пользователь мог изменять положение видео, но я не хотел перегружать API воспроизведения видео, отправляя его SetPositionзвонки на каждый тик, который пользователь передал на пути к своему конечному пункту назначения.

Это мое решение:

Во-первых, проблемы со стрелками.Вы можете сделать все возможное, чтобы обрабатывать клавиши со стрелками с помощью таймера или какого-либо другого механизма, но я нашел, что это больше боли, чем оно того стоит.Поэтому установите свойство SmallChange и LargeChange равным 0, как упомянуто @Matthias.

При вводе мышью пользователю нужно будет нажать вниз, переместить его и отпустить, чтобы обрабатывать события MouseDown, MouseUp и Scroll на трекбар следующим образом:

    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 голосов
/ 11 мая 2012

Попробуйте это с обработчиком событий trackbar_valuechanged:

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