我正在编写一个仅与 Remote 一起使用的应用程序。
我希望能够使用 Remote 上的数字键盘转到 ListView 的某个字母(使用按钮上打印的相应字母),例如:
- 2 = A、B 或 C
- 3 = D、E 或 F
目前我让它处理第一个字母,因此按下 2,它将 ListView 滚动到 A。
我想更进一步,让它像旧手机发短信一样工作。因此,如果按一次 2,它将转到 A,如果再次按 2(大约 2 秒内),它将转到 B,依此类推。
我不确定我会如何去做这件事,也许这超出了我的能力范围。我将不胜感激任何提示或一些您过去可能用来做类似事情的示例代码。
这是我目前的代码,仅适用于第一个字母:
Sub doLookup(ByVal input As String)
For i As Integer = 0 To Showslist.Items.Count - 1
Dim selected As Object = Showslist.Items.Item(i)
Dim name As String = selected.name
name = name.ToLower
If name.StartsWith(input.ToLower) Then
Showslist.SelectedIndex = i
Showslist.ScrollIntoView(Showslist.SelectedItem)
Exit For
End If
Next
End Sub
Private Sub Showslist_KeyUp(sender As Object, e As KeyEventArgs) Handles Showslist.KeyUp
Case Key.Return
Case Key.D2
doLookup("a")
Exit Select
Case Key.D3
doLookup("d")
Exit Select
Case Key.D4
doLookup("g")
Exit Select
Case Key.D5
doLookup("j")
Exit Select
Case Key.D6
doLookup("m")
Exit Select
Case Key.D7
doLookup("p")
Exit Select
Case Key.D8
doLookup("t")
Exit Select
Case Key.D9
doLookup("w")
Exit Select
Case Key.D1
doLookup("1")
Exit Select
Case Key.D0
Showslist.SelectedIndex = 0
Showslist.ScrollIntoView(Showslist.SelectedItem)
Exit Select
End Select
End Sub
最佳答案
思考问题的一种方法是了解按键的当前状态。从#2到#8的每个数字键都有三种状态(key.D2,“a”,“b”,“c”)(key.D3,“d”,“e”,“f”),除了# 9 键有四种状态 (key.D9, “w”, “x”, “y”, “z”)*
**假设使用美国英语键盘。
我的解决方案是将按下的键存储在私有(private)变量中。我还存储了该键被按下的次数。
Private currentKey As Key
Private currentKeyPresses As Integer
使用Mod
运算符将数字保持在正确的范围内
currentKeyPresses = (currentKeyPresses + 1) Mod 3
现在按 #2 键可循环显示值 0、1、2、0、1、2 等。
当按下新的数字键时,重置 currentKey
和 currentKeyPresses
变量。
currentKey = e.Key
currentKeyPresses = 0
我将状态存储代码放在 KeyDown 事件中,并修改了 KeyUp 事件代码以查找每次按键的正确字母。
代码
Private currentKey As Key
Private currentKeyPresses As Integer
Private currentLetter As String
Private letters As String = "abcdefghijlmnopqrstuvwxyz"
Private Sub Showslist_KeyDown(sender As Object, e As KeyEventArgs) Handles Showslist.KeyDown
If currentKey = e.Key Then
If currentKey = Key.D9 Then
' the D9 key contains (4) letters (WXYZ)
currentKeyPresses = (currentKeyPresses + 1) Mod 4
Else
' assumes there are only three letters per key
' e.g D2 contains (3) letters (ABC)
currentKeyPresses = (currentKeyPresses + 1) Mod 3
End If
Else
' this is the first time using that digit key
currentKey = e.Key
currentKeyPresses = 0
End If
End Sub
Private Sub Showslist_KeyUp(sender As Object, e As KeyEventArgs) Handles Showslist.KeyUp
Dim currentLetter As String = ""
Select Case e.Key
Case Key.Return
Case Key.D2
currentLetter = GetLetterForDKey(0, currentKeyPresses)
Case Key.D3
currentLetter = GetLetterForDKey(3, currentKeyPresses)
Case Key.D4
currentLetter = GetLetterForDKey(6, currentKeyPresses)
Case Key.D5
currentLetter = GetLetterForDKey(9, currentKeyPresses)
Case Key.D6
currentLetter = GetLetterForDKey(12, currentKeyPresses)
Case Key.D7
currentLetter = GetLetterForDKey(15, currentKeyPresses)
Case Key.D8
currentLetter = GetLetterForDKey(18, currentKeyPresses)
Case Key.D9
currentLetter = GetLetterForDKey(21, currentKeyPresses)
Case Key.D1
doLookup("1")
Case Key.D0
Showslist.SelectedIndex = 0
Showslist.ScrollIntoView(Showslist.SelectedItem)
Exit Select
End Select
doLookup(currentLetter)
End Sub
Private Function GetLetterForDKey(startPosition As Integer, pressCount As Integer) As String
Return letters.Substring(startPosition + pressCount, 1)
End Function
关于wpf - 将数字映射到相应的字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27460149/