WPF WaitCursor

142 阅读1分钟

WPF 应用程序中,可以通过设置 Cursor 属性来实现等待光标的显示。当应用程序正在执行耗时操作时,可以将鼠标光标更改为等待状态(通常是一个沙漏图标),以向用户表明当前正在进行处理。

1. WaitCursor 封装实现

cursor.gif

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);
        }
    });
}