2013-04-02 3 views
1

У меня есть список с именами файлов. Когда выбранный индекс изменен, я загружаю файл.Установка задержки для действия в ListBox _SelectedIndexChanged

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

+0

Я отредактировал ваше название. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

1

Это будет работать, если вы используете WinForms, сделать вызов метода InitTimer в конструкторе Form.

Загрузите файл в обработчик события _timer_Tick. Чтобы изменить задержку, установите значение Interval в InitTimer в другое значение.

private System.Windows.Forms.Timer _timer; 

private void InitTimer() 
{ 
    _timer = new Timer { Interval = 500 }; 
    _timer.Tick += _timer_Tick; 
} 

private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    _timer.Stop(); 
    _timer.Start(); 
} 

private void _timer_Tick(object sender, EventArgs e) 
{ 
    _timer.Stop(); 
    // TODO: Load file here 
} 
+0

Отличный !! Работает как зверь! Спасибо. – Paul

0

Winforms:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private CancellationTokenSource _cancel; 
    private object _loadLock = new object(); 

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     lock (_loadLock) 
     { 

      handleCancellation(); 

      var loader = new Task((chosenFileItemInListbox) => 
       { 
        Thread.Sleep(1000); 
        LoadFile(chosenFileItemInListbox); 
       }, listBox1.SelectedItem, _cancel.Token); 
     } 
    } 

    private bool handleCancellation() 
    { 
     bool cancelled = false; 

     lock (_loadLock) 
     { 
      if (_cancel != null) 
      { 
       if (!_cancel.IsCancellationRequested) 
       { 
        _cancel.Cancel(); 
        cancelled = true; 
       } 
       _cancel = null; 
      } 
     } 

     return cancelled; 
    } 

    private void LoadFile(object chosenFileItemInListbox) 
    { 
     if (handleCancellation()) 
     { 
      return; 
     } 
    } 
} 

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

<ListBox SelectedItem="{Binding Path=SelectedFile, Delay=1000}" /> 
0

Использование Threading для разделения загрузки с вашего графического интерфейса.

Это поможет вам начать:

общественного класса MainWindow парциальное: Окно {

CancellationTokenSource cts; 
bool loading; 

private void SelectedIndexChanged(int index) 
{ 
    if (loading) 
     cts.Cancel(); 

    cts = new CancellationTokenSource(); 

    var loader = new Task.Delay(1000); 
    loader.ContinueWith(() => LoadFile(index)) 
      .ContinueWith((x) => DisplayResult(x)); 

    loader.Start(); 
} 

private void DisplayResult(Task t) 
{ 
    // TODO: Invoke this Method to MainThread 
    if (!cts.IsCancellationRequested) 
    { 
     // Actually display this file 
    } 
} 

Не удалось проверить, так как я все еще на .net 4, тогда как Task.Delay() есть. net 4.5 Возможно, вам понадобится добавить другое поле в форме для переноса содержимого файла из задач в графический интерфейс.

Смежные вопросы