You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# UWP中KeyDown事件控制Canvas元素移动失效问题求助

问题排查与修复方案

核心问题原因

  • 事件触发失效:Grid默认不是可获得焦点的控件,绑定在它上面的KeyDown/KeyUp事件无法接收键盘输入
  • 初始坐标缺失:goodPlayer没有设置初始的Canvas.Top和Canvas.Left,第一次读取坐标时会得到NaN值,导致移动逻辑失效
  • 冗余代码问题:渲染事件中创建的Posotion实例完全未被使用,属于无效代码,同时Posotion类名存在拼写错误(正确应为Position)

具体修复步骤

1. 修复键盘事件触发问题

在MainPage构造函数末尾添加代码,让页面初始化后直接获得焦点:

// MainPage构造函数最后添加
this.Focus(FocusState.Programmatic);

也可以修改XAML的Grid节点,添加IsTabStop="True"属性让Grid可获得焦点:

<Grid Background="#ADDFFF" KeyDown="Grid_KeyDown" KeyUp="Grid_KeyUp" IsTabStop="True">

2. 给goodPlayer添加初始坐标

修改XAML中goodPlayer的定义,添加初始位置属性:

<Rectangle x:Name="goodPlayer" Height="100" Width="100" Fill="Blue" Canvas.Top="0" Canvas.Left="0" />

3. 清理冗余代码

删除CompositionTarget_Rendering方法中无用的Posotion实例创建代码,优化后代码如下:

private void CompositionTarget_Rendering(object sender, object e)
{
    imgTop = (double)goodPlayer.GetValue(Canvas.TopProperty);
    imgLeft = (double)goodPlayer.GetValue(Canvas.LeftProperty);
    Goodie goodPlayerFunc = new Goodie(goUp, goDown, goLeft, goRight, jump, imgLeft, imgTop, steps);
    goodPlayerFunc.movePlayer(goodPlayer, cnvAddControls);
}

可选优化

不需要每次渲染都新建Goodie实例,可以将Goodie改为页面全局变量,每次渲染只更新它的移动状态和坐标,减少不必要的对象创建开销。

内容的提问来源于stack exchange,提问作者Inbar Manor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 19:06:03