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
相关产品推荐
相关产品推荐

