wpf - 将数字映射到相应的字母

标签 wpf vb.net

我正在编写一个仅与 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 等。 当按下新的数字键时,重置 currentKeycurrentKeyPresses 变量。

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/

相关文章:

wpf - 如何在不知道进度动画的完成度的情况下显示进度动画?

c# - 如何从同步创建异步方法

c# - 是否可以从 vb.net dll 中的 dll 导入 c# 类?

c# - .NET 整数与 Int16?

asp.net-mvc - 是否可以在ASP .NET MVC中使用不带 Controller 功能名称的URL?

c# - VB.NET 奇怪的 IF 语句行为,总是其他

.net - WPF MVVM Prism 应用程序中的内存泄漏

WPF 用户控件数据绑定(bind)不起作用

wpf - 使用模型优先方法时是否可以缓存 View ?

c# - 使用 MVVM C#​​ 将 UpdateSourceTrigger 设置为 WPF ListBox 项源控件的显式