Как проверить скольжение TrackBar с помощью удержания и отпускания мыши - PullRequest
3 голосов
/ 19 апреля 2011

В моей программе WinForms есть трекбар, который, перемещая его, требует огромных затрат времени и средств. Посмотрите на этот код:

trackBar_ValueChanged(object sender, EventArgs e)
{
     this.RefreshData();
}

Эта дорожка имеет 20 шагов. Если пользователь возьмет ползунок на трекбар и потянет его с 20 на 0 в моем случае, «RefreshData» будет выполнен 20 раз, хотя он показывает правильные данные, когда завершает процесс «RefreshData» со значением 0, я хочу сделать что-то вроде он вызывает 'RefreshData' только тогда, когда ползунок trackBar был выпущен, поэтому он не будет обрабатывать все шаги до точки освобождения на панели треков.

Любая помощь и советы для достижения этой цели будут оценены! Спасибо.

Ответы [ 4 ]

5 голосов
/ 26 июля 2012

Как насчет:

Boolean user_done_updating = false;

private void MytrackBar_ValueChanged(object sender, EventArgs e)
{
    user_done_updating = true;
}

private void MytrackBar_MouseUp(object sender, MouseEventArgs e)
{
    if (user_done_updating)
    {
        user_done_updating = false;
        //Do Stuff
    }
}
1 голос
/ 26 июля 2012

Рассмотрите возможность выполнения долгосрочного метода в новом потоке. Сохраните ссылку на этот поток и вызовите Thread.Abort () перед его повторным запуском.

1 голос
/ 20 апреля 2011

Способ, которым я делал подобные вещи раньше, - это использование таймера.Каждый раз, когда значение TrackBar изменяется, сбрасывайте таймер так, чтобы он срабатывал за 500 мс (или любой другой, подходящий для вас).Если пользователь изменяет значение до того, как таймер сработает, он будет сброшен снова, а это означает, что, даже если он меняется несколько раз, таймер сработает только один раз.запускать в другом потоке, и вы не сможете обновить пользовательский интерфейс из этого потока, поэтому вам придется вернуться обратно в поток пользовательского интерфейса, чтобы внести в него изменения.Тем не менее, если вы сможете переместить большую часть вашей дорогой работы в этот фоновый поток, вы будете дольше поддерживать отзывчивый интерфейс.

Вот пример кода, который должен дать вам некоторое представление о том, что я имею в виду.

public partial class Form1 : Form
{
    private int updateCount;
    private System.Threading.Timer timer;

    public Form1()
    {
        this.InitializeComponent();
        this.timer = new System.Threading.Timer(this.UpdateValue);
    }

    private void UpdateValue(object state)
    {
        // Prevent the user from changing the value while we're doing
        // our expensive operation
        this.Invoke(new MethodInvoker(() => this.trackBar1.Enabled = false));

        // Do the expensive updates - this is still on a background thread
        this.updateCount++;

        this.Invoke(new MethodInvoker(this.UpdateUI));
    }

    private void UpdateUI()
    {
        this.label1.Text = this.updateCount.ToString();

        // Re-enable the track bar again
        this.trackBar1.Enabled = true;
    }

    private void trackBar1_ValueChanged(object sender, EventArgs e)
    {
        this.timer.Change(TimeSpan.FromMilliseconds(500), new TimeSpan(-1));
    }
}

Редактировать: Вот решение, которое использует таймер выигрышных форм, чтобы сделать время.Разница здесь в том, что вы заблокируете пользовательский интерфейс во время выполнения вычислений;это может или не может быть хорошо в вашей ситуации.

public partial class Form1 : Form
{
    private int updateCount;
    private Timer timer;

    public Form1()
    {
        this.InitializeComponent();

        this.timer = new Timer();
        this.timer.Interval = 500;
        this.timer.Tick += this.Timer_Tick;
    }

    private void Timer_Tick(object sender, EventArgs e)
    {
        this.timer.Stop();

        this.updateCount++;
        this.label1.Text = this.updateCount.ToString();
    }

    private void trackBar1_ValueChanged(object sender, EventArgs e)
    {
        this.timer.Stop();
        this.timer.Start();
    }
}
0 голосов
/ 19 апреля 2011
...