WPF 应用程序中,可以通过设置 Cursor 属性来实现等待光标的显示。当应用程序正在执行耗时操作时,可以将鼠标光标更改为等待状态(通常是一个沙漏图标),以向用户表明当前正在进行处理。
1. WaitCursor 封装实现
using System;
using System.Windows;
using System.Windows.Input;
using System.Windows.Threading;
namespace MyControls.Controls
{
public class WaitCursor : IDisposable
{
private readonly Dispatcher dispatcher;
private Cursor previousCursor;
public WaitCursor()
{
// 获取当前线程的Dispatcher(通常是UI线程)
dispatcher = System.Windows.Application.Current?.Dispatcher;
if(null != dispatcher)
{
dispatcher.Invoke(() =>
{
previousCursor = Mouse.OverrideCursor;
Mouse.OverrideCursor = Cursors.Wait;
});
}
else
{
// 如果没有 Dispatcher,则直接设置(适用于非 WPF 环境)
previousCursor = Mouse.OverrideCursor;
Mouse.OverrideCursor = Cursors.Wait;
}
}
public void Dispose()
{
if (dispatcher != null)
{
// 强制通过 Dispatcher 恢复光标
dispatcher.Invoke(() => Mouse.OverrideCursor = previousCursor);
}
else
{
// 如果没有 Dispatcher,则直接恢复
Mouse.OverrideCursor = previousCursor;
}
}
}
}
2. WaitCursor 调用
2.1 UI 线程中调用
private void Button_Click(object sender, RoutedEventArgs e)
{
using (new WaitCursor()) // 自动管理光标的切换和恢复
{
// 模拟耗时操作
System.Threading.Thread.Sleep(3000);
}
}
2.2 后台线程中调用
private void StartBackgroundOperation()
{
Task.Run(() =>
{
using (new WaitCursor()) // 即使在后台线程中调用,也会自动切换到 UI 线程
{
// 模拟耗时操作
System.Threading.Thread.Sleep(3000);
}
});
}