问题描述
我想通过键盘的上下左右键,完成对于Button的选中状态的改变。在这里,我先给所有的button弄了tab按钮顺序;上:选中上一行的button。下:选中上一行的button。左:选此行左边的button。右:选此行右边的button。求大神们指导。谢谢!
解决方案
解决方案二:
不失一般性,假设我们对于所有要判断操作的Button抽象一下其位置概念,例如设计其数据结构是publicclassPos{publicintLeft,Top,Right,Bottom;publicButtonTarget;}
那么假设你已经将需要参与判断的按钮记录到一个List<Pos>集合中(用变量datas引用这个集合),假设要找到某个坐标(x,y)“左边最近的一个位置”,就可以这样查询varbutton=(frompindataswherep.Right<=x//只判断起点在x左边的按钮letdist=Math.Abs(p.Right-x)*3+Math.Abs((p.Top+p.Bottom)*0.5-y)//查找距离时,假设x方向的距离权重为3orderbydistselectp.Target).FirstOrDefault();
这里,使用类似“曼哈顿距离”的方式来估计距离,并且将x方向放大3倍,以便优先选择“行y坐标比较接近”的button。对于上、右、下的查询语句,是类似的,只要选择距离最近的一个button即可。
解决方案三:
只判断起点在x左边的按钮-->只判断right边在x左边的按钮这里,简单来说:程序=数据结构+linq查询算法把二者分别写清楚即可。
解决方案四:
你之前给button设置TabIndex,其实是没用的。因为关键点在于坐标,而且button之间的坐标相对性是变动的(甚至不是矩阵的),不是死板的。扩大开来,假设你的form其实是一张“世界地图”,而你的button此时只是一些很小的、坐标可能动态变化的矩形,并且有几十万甚至上百万个button,此时要寻找距离(x,y)最近的一个(或者10个)button,应该做什么修改呢?根据业务实际,通常首先只在(x,y)周边的一个限制范围内来查找Pos对象,也就是在第一个条件上就排除了99.5%的对象了,然后才来根据dist排序。这样分为两阶段查询,就可以优化查询。更重要地优化(例如Uber就需要进行这样的优化)做法,是需要将这个“限制范围”表示地图上确定编号的、某几个相邻的矩形或者六边形,这样大量查询所确认的“限制范围”就能使用到之前刚刚重复了上万次的缓存结果,而不是每一次查询时都去到datas里边去找。