1

我有一个带有文件名的列表框。更改所选索引时,我会加载文件。

我想要 jQuery 的 HoverIntent 之类的东西,它可以在短时间内延迟加载文件的操作,这样用户就可以使用向下箭头并快速循环浏览列表中的项目,而无需应用程序尝试加载每个项目。Thread.Sleep 暂停整个应用程序,因此用户在睡眠完成之前无法选择另一个列表项,这显然不是我想要的。

4

3 回答 3

1

如果您 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
}
于 2013-04-02T22:43:54.017 回答
0

窗体:

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}" />
于 2013-04-02T22:21:04.590 回答
0

使用线程将加载与您的 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。

于 2013-04-02T22:25:22.720 回答