C# 当用户界面忙时更改光标
我有这门课:C# 当用户界面忙时更改光标,c#,wpf,multithreading,C#,Wpf,Multithreading,我有这门课: public class CursorWait : IDisposable { private readonly CancellationTokenSource _tokenSource; public CursorWait(int showAfter) { _tokenSource = new CancellationTokenSource(); Task.Delay(showAfter, _tokenSource.Tok
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线程,而应该只是更改窗口的属性ISITETSTVISIBLE。但我是这个项目的新手,我的团队就是这样做的,他们不会让我做的,因为项目快完成了
Application.Current.Dispatcher.Invoke(new Action(()=>
{
// your code
}));
或
有关详细信息,请访问:在设置鼠标光标后尝试添加此行
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate { }));
当我说“Mouse.SetCursor依赖于UI线程”时,我的意思是我不会改变,因为UI线程很忙,执行调用不会让它变得不那么忙。我的理解是,这一行大致相当于基于表单的应用程序中的Application.DoEvents。它应该使UI线程处理任何挂起的窗口消息,包括更改光标。
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate { }));