wpf的keydown事件

作者:超级管理员 更新时间:2017-09-13 09:58:43 来源:未知 点击:15642
页面只有这句话         
页面只有这句话 <Grid>
        <TextBox KeyDown="Window_KeyDown" Name="TB" HorizontalAlignment="Left" Height="23" Margin="365,94,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>

    </Grid>

代码里面是:public MainWindow()
        {
            InitializeComponent();
            if (!TB.IsFocused)
            {
                Console.WriteLine("buzai");
            }
            Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Render,
new Action(() => TB.Focus()));
            TB.SelectionStart = TB.Text.Length;
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            Console.Write("wocao");
        }

现在问题是我按下键盘,不触发事件,按下enter键才触发这个事件

以下是关于本问题的解决方案:

解决方案1、
不可能的 一定是有什么位置在进行按键的拦截 仔细找找吧
解决方案2、
发现改成keyUp方法又可以按键就触发事件,不需要按下enter也能触发。但是用keyDown就需要按下enter才触发
解决方案3、
 Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Render,
new Action(() => TB.Focus()));
-》为什么会这样写呢,一个调用Focus方法而已,即使要写 ,也要写到loaded事件里。因为在loaded完毕 控件才render完毕,这时候focus是合乎常理的。也许你按键的时候,TextBox压根就没有获取焦点。
解决方案4、
引用 3 楼 duanzi_peng 的回复:
 Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Render,
new Action(() => TB.Focus()));
-》为什么会这样写呢,一个调用Focus方法而已,即使要写 ,也要写到loaded事件里。因为在loaded完毕 控件才render完毕,这时候focus是合乎常理的。也许你按键的时候,TextBox压根就没有获取焦点。


原本只是用了TB.Focus()。用这个是因为PasswordBox用Focus方法会失败。
解决方案5、
引用 3 楼 duanzi_peng 的回复:
 Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Render,
new Action(() => TB.Focus()));
-》为什么会这样写呢,一个调用Focus方法而已,即使要写 ,也要写到loaded事件里。因为在loaded完毕 控件才render完毕,这时候focus是合乎常理的。也许你按键的时候,TextBox压根就没有获取焦点。


不使用焦点,按三次1,不输出,按enter键输出
解决方案6、
引用 1 楼 u011785544 的回复:
不可能的 一定是有什么位置在进行按键的拦截 仔细找找吧



我也这样觉得,不过代码就只有这一点点而已了。
解决方案7、
你断点看下按下非enter时,e.KeyCode是什么?已确定有没有接收到键盘
解决方案8、
引用 7 楼 From_TaiWan 的回复:
你断点看下按下非enter时,e.KeyCode是什么?已确定有没有接收到键盘


额,这个断点设置在那里,我试过放在这个响应的方法里面,但是只有按下enter键才进入这个响应方法,按其他键不进入这个方法
解决方案9、
引用 5 楼 webnonono 的回复:
不使用焦点,按三次1,不输出,按enter键输出

把你的xaml,后台代码 全部贴出来。
解决方案10、
引用 9 楼 duanzi_peng 的回复:
Quote: 引用 5 楼 webnonono 的回复:

不使用焦点,按三次1,不输出,按enter键输出

把你的xaml,后台代码 全部贴出来。



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace 谁拦截了我的按键
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void TextBox_KeyDown(object sender, KeyEventArgs e)
        {
            Console.WriteLine("dddd");
        }

       
    }
    
}



<Window x:Class="谁拦截了我的按键.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:谁拦截了我的按键"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525"
        >
    <Grid>
        <TextBox  KeyDown="TextBox_KeyDown" HorizontalAlignment="Left" Height="23" Margin="189,161,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>

    </Grid>
</Window>

解决方案11、
引用 10 楼 webnonono 的回复:

不存在你描述的那种情况。不获取焦点是不会执行keydown事件的。
解决方案12、
请关闭输入法。
因为一个输入法的存在,就可以造成这一问题,键盘焦点在输入法上的。所以不要在TextBox这样的文本输入控件上,用keydown能有什么用处。
解决方案13、
回车键比较特殊,这和你按不按shift没有关系,即便你的输入法设靠shift暂时设置成英文,也解决不了这个问题,除非彻底关闭输入法。 
如果你想做什么的化,可以靠TextChanged事件
解决方案14、
不代表所有输入法都是如此,但不少都是这样。
解决方案15、
引用 14 楼 summergo123321 的回复:
不代表所有输入法都是如此,但不少都是这样。


我。。。。还真的是这个输入法的问题。谢谢。

解决方案16、
也谢谢大家替我看代码了

推荐阅读

热门内容

关于对文件名使用 string.Repl

这里我用replace()想要让文件名变...

wpf的keydown事件

页面只有这句话       ...

ASP.NET MVC验证表单

代码如下        [Require...

EasyUi Datagrid+Deta

各位牛人,有没有做过类似的功能效果,Ea...

c#串口程序界面卡死问题

 private void sp_Dat...

C# 判断一张图片是否是空白图片

平时做文件扫描存档,一般都是双面扫描.扫...

我在Winform中修改WebBrows

我在Winform中修改WebBrows...

c# 引用webservice 出现问题

我在浏览器浏览没问题就是在项目中添加服务...

有人这么黑易语言,连我都看不下去了

本帖最后由caozhy于2017-09-...

窗体加载时,代码未执行完就弹出了窗体

不知道是这样写不合理,还是我哪里写错了呢...

最新内容

关于对文件名使用 string.Replace() 没有作用 请教

这里我用replace()想要让文件名变成E:\CloudMusic\薛之谦 -...

以下代码实现的单例模式有什么缺陷?如果有,请做出你的修改!

public sealed class Singleton       stat...

wpf的keydown事件

页面只有这句话         

ASP.NET MVC验证表单

代码如下        [Required(ErrorMessage = "标题...

以XX开头的标识符太长,最大长度为128

本帖最后由qz6412525于2017-09-1212:09:14编辑如题,是一...

分部声明包含冲突的可访问性修饰符

代码如下:namespace ConstDefinitionLib{    pu...

关于 查询语句 中select 索引问题

string[] fruits = { "apple", "banana", "...

EasyUi Datagrid+DetailView 如何让他默认全部展开

各位牛人,有没有做过类似的功能效果,EasyUI DataGrid+Detail...

c#串口程序界面卡死问题

 private void sp_DataReceived(object sen...

浏览器内核问题

请问有谁会使用vs2013,用c#或vb编写在winform里面嵌一个谷歌浏览器...

LINQ to Entities 不识别方法“System.DateTime AddMinutes(Double)”,因此该方法无法转换为存储表达式。

代码如下,求大神帮忙看看:                    DateTim...

mvc 怎么执行mysql里的存储过程

我的连接是这样的。 public class mysqlconn : DbCon...

C# 判断一张图片是否是空白图片

平时做文件扫描存档,一般都是双面扫描.扫描之后,需要存档,有些背面空白的,需要剔...

我在Winform中修改WebBrowser控件修改User-Agent的方法貌似对WebkitBrowser无效,我已经修改为手机了

我在Winform中修改WebBrowser控件修改User-Agent的方法貌...

RawSocket抓包时,如果是正在传文件,则丢包严重的吓人

50M的文件传输,只抓到100-200KB。public void Run() ...

如何让Toast占满整个屏幕(包含状态栏)

本帖最后由sixsun1989于2017-09-1221:15:38编辑    ...

不熬夜看这里 苹果发布会直播全程回顾

        想必今天一早醒来,你的朋友圈和新闻头条一定都会被昨晚科技圈的大事...

网友心声有求必应 苹果同传四川话版

         在苹果秋季发布会开始前两周,我们针对网友喜欢听什么地方方言做过...

iPhone X演示出重大失误?背后另有真相

    中关村在线消息:苹果公司于美国西部时间9月12日上午10点(北京时间9月...

全视曲面商务旗舰 三星Note 8今晚发布

    中关村在线消息: 备受大家期待的三星新旗舰Note 8将于今晚18时在北...