【问题标题】:ComboBox KeyDown event how to take into account last pressed keyComboBox KeyDown 事件如何考虑最后按下的键
【发布时间】:2016-03-28 10:29:12
【问题描述】:

我有一个可编辑的组合框,并且必须处理输入的值(它必须是一个数字)。 在 keydown 事件中,我分析 combobox.text 并采取相应措施。 当然,在这种情况下,combobox.text 应该包含 keydown 事件之前的所有文本。相反,我希望包含最后的完整文本键。

我已经试过了

e.handled=true;

在分析 combobox.text 之前,但这不起作用。

作为辅助解决方案,我分析 e.key 并将其转换为字符串并进行处理。问题是它是一个keyeventargs。 试过了

char ch ;
String str;
if (e.Key > Key.D0 && e.Key < Key.D9)
{
  ch = (char)((int)e.Key - (int)Key.D0);
  str = ch.ToString();
}

但是没用

---添加--- 对不起,我没有说清楚,我会努力让它变得更好。 我想在以下活动中处理我的组合框

private void ComboBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)

在里面我想做一些类似的事情

Analyze(combobox.text)

简而言之

private void ComboBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
 if((e.Key > Key.D0 && e.Key < Key.D9) || (e.Key > Key.NumPad0 && e.Key < Key.NumPad9))
  {
    Analyze(comboBox.text)---->text here has to be the combobox.text plus the new pressed key 
  }
}

【问题讨论】:

  • 您无法读取用户输入的字符?

标签: c# wpf combobox keydown


【解决方案1】:

在您的情况下,我并不完全清楚“采取相应行动”的含义,但请尝试将其用于您的次要解决方案:

        string str = string.Empty;
        if (e.Key > Key.D0 && e.Key < Key.D9)
        {
            str = ((int)e.Key - (int)Key.D0).ToString();
        }
        MessageBox.Show(str);

将它放在 ComboBox 的 keydown 事件中会为我返回正确的字符串,假设正确的方法是获取用户刚刚按下的数字键的字符串表示形式。

我真的很好奇你的最终目标是什么。也许详细说明会导致更好的答案。您是否必须在输入的每个键处验证输入?为什么?

【讨论】:

  • 你是对的,你的评论正在播下怀疑的种子。我所做的是解析 combobox.text 并放入一个 in 变量。这在逻辑上是错误的吗?
  • @Patrick 不一定是错的。您的 UI 中还有什么?理想的情况是,如果用户可以使用某种方式告诉您他们已完成当前屏幕中的输入。像确定按钮之类的东西,或者他们必须按返回键才能将编辑存储到组合框。然后你可以在那个事件中解析它,节省大量的连续输入处理。如果你必须以某种方式分析每个关键输入......那么你必须做你必须做的:)。
  • 这是一个可编辑的组合框(我的程序中有很多)。用户可以从组合框中选择一个值(这些是默认值)或键入一个新值。
  • 新的被 ComboBox_KeyDown 事件确认。因此,当事件被触发时,我检查它是否是数字,然后我必须将组合框文本保存在一个变量中。但是如果我这样做 var = combobox.text 它不会考虑最后一个键。因此,您的解决方案作为 B 计划派上用场。计划 A 类似于“做一些事情,以便自动在 combobox.text 中有按下的键”,但它可能不存在。无论如何,您的解决方案解决了问题。
【解决方案2】:

我不能完全理解你想要什么,但我会尽力做到最好。如果要读取用户发来的字符,使用事件PreviewTextInput会更方便:

XAML:

<ComboBox Name="comboBox" IsEditable="True" PreviewTextInput="comboBox_PreviewTextInput"/>

C#:

string theWholeString;
private void comboBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
   string currentCharacter = e.Text;
   theWholeString += e.Text;
}

这样更好,因为您不必弄清楚输入是数字还是字符串。

如果我误解了你,请告诉我。

【讨论】:

    【解决方案3】:

    除了 Rowbear 提出的解决方案之外,还有一种更简单的方法可以解决我的问题。那就是使用 ComboBox_KeyUp 事件。通过这样做,新密钥已经被识别。我说我想放下钥匙误导了所有人,这很糟糕。我添加这个只是为了完整性

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多