weixin_39993998 2023-11-11 12:11 采纳率: 50%
浏览 6

如何真实捕捉C#鼠标点击


private Task<Position> WaitForMouseClick(Grid chessboard)
        {
            var tcs = new TaskCompletionSource<Position>();
            tcs = null;
            MouseButtonEventHandler mouseLeftButtonDownHandler = null;

            mouseLeftButtonDownHandler = (sender, e) =>
            {
                Point clickPosition = e.GetPosition(chessboard);
                int row = (int)(clickPosition.Y / (chessboard.ActualHeight / ROWS));
                int col = (int)(clickPosition.X / (chessboard.ActualWidth / COLS));

                // 设置任务为已完成,以便继续执行下一步操作
                tcs.SetResult(new Position(row, col));

                // 解绑事件处理程序,防止重复执行
                chessboard.MouseLeftButtonDown -= mouseLeftButtonDownHandler;
            };

            // 绑定事件处理程序
            chessboard.MouseLeftButtonDown += mouseLeftButtonDownHandler;

            return tcs.Task;
        }

如上,此时程序根本不等鼠标点击就向下执行,在return处报错 tcs==null

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-11 15:07
    关注

    【以下回答由 GPT 生成】

    我可以解决该问题。
    
    在你的代码中,出现了一个问题。在创建 TaskCompletionSource 之后,立即将 tcs 设置为 null,这将导致 tcs 变为 null,无法正常工作。应该把 tcs 设置为 TaskCompletionSource<Position> 的实例,然后在事件处理程序中设置其结果。
    
    请修改你的代码如下:
    
    ```c#
    private Task<Position> WaitForMouseClick(Grid chessboard)
    {
        var tcs = new TaskCompletionSource<Position>();
        MouseButtonEventHandler mouseLeftButtonDownHandler = null;
    
        mouseLeftButtonDownHandler = (sender, e) =>
        {
            Point clickPosition = e.GetPosition(chessboard);
            int row = (int)(clickPosition.Y / (chessboard.ActualHeight / ROWS));
            int col = (int)(clickPosition.X / (chessboard.ActualWidth / COLS));
    
            // 设置任务为已完成,以便继续执行下一步操作
            tcs.SetResult(new Position(row, col));
    
            // 解绑事件处理程序,防止重复执行
            chessboard.MouseLeftButtonDown -= mouseLeftButtonDownHandler;
        };
    
        // 绑定事件处理程序
        chessboard.MouseLeftButtonDown += mouseLeftButtonDownHandler;
    
        return tcs.Task;
    }
    

    通过这样的修正,你的函数将能够正确捕捉鼠标点击事件并返回 Task 对象,其中包含鼠标点击的位置信息。 ```


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 11月11日

悬赏问题

  • ¥15 有人会SIRIUS 5.8.0这个软件吗
  • ¥30 comsol仿真等离激元
  • ¥15 静电纺丝煅烧后如何得到柔性纤维
  • ¥15 (标签-react native|关键词-镜像源)
  • ¥100 照片生成3D人脸视频
  • ¥15 伪装视频时长问题修改MP4的时长问题,
  • ¥15 JETSON NANO
  • ¥15 VS开发qt时如何在paintgl函数中用pushbutton控制切换纹理
  • ¥20 关于 openpyxl 处理excel文件地问题
  • ¥15 MS中不知道高分子的构型怎么构建模型