【问题标题】:How can I filter keyboard number keys如何过滤键盘数字键
【发布时间】:2011-11-29 20:23:46
【问题描述】:

我希望关注特定的Textbox 并仅在用户按下数字键(1、2、3 等)时接受按键,否则我不想关注 Textbox...

塞纳里奥:

我在视图中有ListView(具有自定义视图)。在列表视图下方我有一个Textbox

假设 ListView 包含编号为 1、2、3、33、373 等的项目。

现在当我按下一个数字键时,比如说Key 3,应该会发生以下动作:

  1. 关注具体TextBox
  2. TextBox 文本中附加数字输入
  3. 选择ListView中与TextBox.Text具有相同编号的项目

我尝试过的 Xaml

<ListView Name="lv"
              Grid.Row="1"
              ItemsSource="{Binding}"
              View="{Binding Path=SelectedItem,
                             ElementName=viewComboBox}" DisplayMemberPath="Name" IsTextSearchEnabled="True" TextSearch.TextPath="{Binding Path=Person.Name}"/>
    <TextBox  Grid.Row="2" Text="{Binding Path=TextSearch.Text,ElementName=lv}"></TextBox>  

TextBox 中没有显示任何内容,我不知道如何处理数字键按下。

我需要这个以及它使用 MVVM 令人困惑...

在这方面的任何帮助都会很棒。使用代码的一些指导会更好......谢谢......

【问题讨论】:

    标签: wpf mvvm keypress


    【解决方案1】:

    此逻辑特定于视图。如果你把它放在后面的代码中就可以了。 MVVM 不会阻止您在代码后面编写特定于视图的代码。

    但是,如果您虔诚地遵循“没有代码背后”的方法,那么您可以创建一个 Behavior 并将所有代码放入其中。您的行为将附加到列表框,并将文本框引用作为属性。它会监听 listbox 上的 keydown 事件并将键添加到文本框的 text 属性中。

    你不应该在 ViewModel 中有这样的逻辑

    【讨论】:

      【解决方案2】:

      如果您使用的是 MVVM,那么 附加行为 是要走的路...http://eladm.wordpress.com/2009/04/02/attached-behavior/

      1. 将您的按键源元素命名为ListView ...

        <ListView x:Name="MyListView">
           ....
        </ListView>
        
      2. 声明并定义ListView 类型的附加属性,比如NumericKeyPressBehavior.FocusTarget

      3. FocusTarget 的来源将是您MyListView,并且该行为将附加到您的TextBox

         <TextBox local:NumericKeyPressBehavior.FocusTarget="{Binding ElementName=MyListView}" 
                  .... />
        
      4. NumericKeyPressBehavior.FocusTarget 的依赖属性更改事件处理程序中,处理ListView 上的按键,然后根据是否按下数字键,聚焦目标文本框并将按下的键字符附加到它。

        private static void  OnFocusTargetChanged(
            DependencyObject o, 
            DependencyPropertyChangedEventArgs e)
        {
            var textBox = o as TextBox;
            var listView = e.NewValue as ListView;
            if (textBox != null && listView != null)
            {
                listView.KeyUp += 
                 (o1, e1) =>
                    {
                        var keyChar = GetKeyCharFromKeyCode(e1.Key);
                        if ("0123456789".Contains(keyChar.ToString()))
                        {
                            textBox.Focus();
                            textBox.Text += keyChar.ToString();
                        }
                    }
            }
        }
        

      GetKeyCharFromKeyCode 在这里找到....C# How to translate virtual keycode to char?

      这有帮助吗?

      【讨论】:

      • 感谢您的回答,我试试看回复您
      猜你喜欢
      • 2017-01-01
      • 1970-01-01
      • 2018-03-06
      • 2015-10-25
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      • 2017-10-02
      • 1970-01-01
      相关资源
      最近更新 更多