我有一个带有文件名的列表框。更改所选索引时,我会加载文件。
我想要 jQuery 的 HoverIntent 之类的东西,它可以在短时间内延迟加载文件的操作,这样用户就可以使用向下箭头并快速循环浏览列表中的项目,而无需应用程序尝试加载每个项目。Thread.Sleep 暂停整个应用程序,因此用户在睡眠完成之前无法选择另一个列表项,这显然不是我想要的。
如果您 usingWinForms
调用构造函数中的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
}
窗体:
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}" />
使用线程将加载与您的 GUI 分开。
这应该让你开始:
公共部分类 MainWindow : Window {
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 您可能需要在表单中添加另一个字段,以便将文件内容从任务传输到 GUI。