UI忙时更改光标

时间:2014-02-25 19:09:02

标签: c# wpf multithreading

我有这堂课:

public class CursorWait : IDisposable
{
    private readonly CancellationTokenSource _tokenSource;

    public CursorWait(int showAfter)
    {
        _tokenSource = new CancellationTokenSource();
        Task.Delay(showAfter, _tokenSource.Token).ContinueWith(delegate(Task task)
        {
            if (!task.IsCanceled)
                Mouse.SetCursor(Cursors.Wait);
        });
    }

    public void Dispose()
    {
        _tokenSource.Cancel();
        Mouse.SetCursor(Cursors.Arrow);
    }
}

像这样使用它:

using (new CursorWait(showAfter: 500))
{
    DoSomethingMayBeHeavyOrNotInUI(); 
}

然而,由于Mouse.SetCursor依赖于UI线程来更改它,并且因为它很忙,它永远不会改变,所以我怎么能改变光标呢?

注意:我知道我不应该阻止UI线程而只是更改窗口的属性IsHitTestVisible。但我是这个项目的新手,我的团队以这种方式做了事情,他们不会让我,因为项目已经完成了

2 个答案:

答案 0 :(得分:2)

尝试添加此行设置鼠标光标后。

Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate { }));

答案 1 :(得分:1)

Application.Current.Dispatcher.Invoke(new Action(()=>
    {
        // your code
    }));

Application.Current.Dispatcher.Invoke(DispatcherPriority.Background,
    new ThreadStart(delegate
        {
            // your code
        }));

有关详情,请访问:MSDN - Dispatcher.Invoke Method