如何检测向下箭头键是否按下了一段时间?

时间:2013-02-05 19:00:25

标签: c# wpf

我有一个问题,我不知道如何解决...... 我有一个可能包含很多项目的列表框。

当用户选择一个项目时,我会进行异步调用并获取一些数据并填充一个屏幕。 用户可以按下向下箭头键或向上箭头键在项目之间导航,问题是当用户按下向下箭头键时,选择变化很快,我的应用程序遇到问题......是否有干净的方式检测用户是否按下了按键一段时间,暂停更新视图,并在发布后才更新它?

如果我不清楚解释这个,我很抱歉,

2 个答案:

答案 0 :(得分:1)

你是不是想要异步......

  1. ...更新填充列表框的集合,或者......
  2. ...根据列表框中当前选定的项目更新单独的视图?
  3. 我猜测#2,当你开始大量异步调用来更新单独的视图时,你会遇到问题。正如@Ramhound指出的那样,通过按住按钮并快速点击相同的按钮(或者只是通过点击作为朝鲜战争的亲游戏玩家)来快速更改选择之间没有区别。要解决这两个问题,您可以执行以下操作:

    1. 设置一个计时器,您可以在选择更改后重置。仅在超时后启动异步查询。这将过滤掉非常快速选择更改。
    2. 确保您一次只有一个正在进行的查询,因此在开始新的异步调用之前,请取消并清除之前的查询。
    3. 通过这种方式,用户可以对选择做任何事情,只有在她实际选择了某些东西后才会更新。调整时间以确保UI仍然是活泼的:)

答案 1 :(得分:0)

如果控件是可聚焦的,您可以覆盖UIElement.OnKeyDown

所以在这种情况下,这意味着基本上创建列表框的子类,然后重写OnKeyDown函数。你可以这样抓住它,但这会让事情变得更加混乱。

或者您可以使用Keyboard.GetKeyStates查询关键状态。

但是,恕我直言,你应该只是预加载数据。 ListBoxes使用'virtualizing stack panel',它们足够聪明,不会显示不需要的信息。