最近在做一个扫码枪识别条形码的功能,TextBox文本按回车键或者是扫码枪识别条形码自动触发查询功能,由于架构采用的是MVVM的开发模式,所以,刚开始采用KeyBinding的方式绑定命令,然后实现该功能;代码如下:
<TextBox>
<TextBox.InputBindings>
<KeyBinding Key="Enter" Command="{Binding TestCmd}"/>
</TextBox.InputBindings>
</TextBox>
对应的ViewModel中绑定命令事件,代码如下所示
//ViewModel文件夹下文件
public class TestViewModel
{
private ICommand m_TestCmd;
public ICommand TestCmd
{
get
{
return m_TestCmd ?? (m_TestCmd = new RelayCommand(() =>
{
}));
}
}
}
初步验证的时候,发现是可以的,条形码是全数字的会触发,但是条形码中包含字母时,就不触发命令事件了,这到底什么原因呢?
调试发现,条形码中含字母时,识别的文本输入TextBox时,最后触发的不是Enter键,而是Return键,至于为什么会触发Return键呢,难道是扫码枪设置得原因,这个我也不清楚,得去网上找原因了。既然这样,那在界面中就把Return键给加上<KeyBinding Key="Return" Command="{Binding TestCmd}"/>,但是发现还是没有触发。
最后不采用KeyBinding绑定命令方式,直接在界面中使用PreviewKeyUp事件,在后台鼠标弹起事件中,调用ViewModel的函数;
xaml设计界面中,TextBox使用PreviewKeyUp事件代码
<TextBox PreviewKeyUp="Test_txt_PreviewKeyUp"/>
在xaml后台(xxxx.xaml.cs) 文件中添加Loaded事件把ViewModel中TestViewModel类和xaml的上下文绑定,代码如下所示
private void TestView_Loaded(object sender, RoutedEventArgs e)
{
DataContext = new ViewModel.TestViewModel();
}
xaml后台写Test_txt_PreviewKeyUp事件,调用ViewModel中的函数。
private void Test_txt_PreviewKeyUp(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter || e.Key == Key.Return)
{
//DataContext:上下文
//ViewModel:项目中文件夹名称,存放XAML对应的ViewModel类文件
//TestViewModel:xaml对应的ViewModel类
if (DataContext != null && (DataContext is ViewModel.TestViewModel))
{
ViewModel.TestViewModel vm = (ViewModel.TestViewModel)DataContext;
if (vm != null)
{
vm.TestCmd.Execute(null);
}
}
}
}
最后达到想要的结果;文章来源:https://www.toymoban.com/news/detail-633770.html
在此做个笔记和分享,大家如果想到其他办法,欢迎评论交流,谢谢。文章来源地址https://www.toymoban.com/news/detail-633770.html
到了这里,关于WPF中TextBox使用KeyBinding绑定命令,键盘事件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!