在禁用控件时维护Tab键顺序,并在不可预测的时间再次启用

Ed *_* S. 12 c# wpf

所以,让我警告你; 我想要一种让黑客工作更好的方法.我承认这是一个黑客攻击,我肯定愿意接受对整个问题的不同看法.也就是说,如果我想让代码截止并且我们有一个有点激进的发布日期,我需要很快得到这个.

因此,我将无法立即进行大的更改,但我可以轻松地为此软件的第一个补丁执行此操作.因此,欢迎短期和长期解决方案,但短期解决方案(如果可能)更可取.

好的,这就是问题所在; 我有一个应用程序将命令发送到机器人硬件设备.在发送需要等待的命令(例如,需要花费未知时间的物理运动)之后,UI进入"忙碌状态".发生这种情况时,将禁用所有将发出另一个阻止命令的控件,因为机器无法处理它们.

当UI退出忙碌状态时,将再次启用所有控件,但由于显而易见的原因,不会保留Tab键顺序.这使得输入区域的标签变得不可能,并且看到我自己几乎完全使用键盘是不可接受的.我目前解决这个问题的方案是:

  1. 在启动时,为应用程序中感兴趣的每个控件注册GotFocus事件.由于这是一个WPF MVVM应用程序,并且还因为某些控件是动态创建的,所以这很困难.不过,我可以搜索视觉和/或逻辑树,然后通过......
  2. 在GotFocus事件中,保存对控件的引用.
  3. 当我们退出忙碌状态时,尝试将焦点设置为已保存的控件.

这有点......有点儿.手头的问题(因为我可以想到更多的失败场景......)是这个逻辑将打开一个上下文菜单,如果它是开放的和另一个.考虑:

  1. 焦点在文本区域.
  2. 用户右键单击另一个控件.此控件无法获得焦点(即使我尝试在鼠标处理程序中设置它).
  3. 右键单击执行移动后,系统进入忙碌状态.
  4. 当忙状态结束时,文本区域被给予焦点并且上下文菜单关闭.

(现在我意识到你可以说在右键单击上执行移动并显示上下文菜单是一个坏主意,但是上下文菜单命令是非阻塞的,启用的,并且它具有方便的域特定用途. )

就是这样.我甚至无法在右键单击中获得焦点,并且将焦点设置到菜单本身也不起作用.我只是好奇,如果有人有更好的计划这样的事情.我意识到这是一个尴尬和非常狭隘的环境.感谢您提前提供的任何帮助,我将更多地玩这个...

H.B*_*.B. 10

有趣的问题,遗憾的是我无法想到问题的立即解决方案,如果这是一个经常发生的事情,我会尝试通过不阻止应用程序解决问题.

如果机器人一次只能执行一个命令,则可能只需要实现一个命令队列,这样仍然可以使用该接口,而当机器人忙时,发出的命令会被延迟.在可用性方面,最好使这个队列非常明显,因此很明显该命令已经发布并将被考虑在内.