KeyDown事件不会从网格中引发

时间:2013-03-06 07:10:22

标签: c# .net wpf keyboard-events

这里我有一个带网格的示例窗口。我需要在按下按键时捕获事件。但是当我点击网格区域然后按键时它不会升起。它只有在Textbox聚焦时才有效。我知道如果我从Window捕获它会有效。但我有其他应用程序,几乎没有用户控件,我需要从不同的应用程序捕获它。我尝试为Window设置Focusable.false,为Grid设置为true,但它没有帮助。 任何解决方案?

<Window x:Class="Beta.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" Closed="Window_Closed_1" Focusable="False">

    <Grid KeyDown="Grid_KeyDown_1" Focusable="True">
    <TextBox x:Name="tbCount" HorizontalAlignment="Left" Height="35" Margin="310,49,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="83"/>

  </Grid>

3 个答案:

答案 0 :(得分:6)

我在通用Windows平台(UWP)应用程序中遇到了同样的问题。我将事件附加到XAML中的网格,但它只在焦点位于TextBox上时才有效。我在MSDN上找到了答案(不仅仅是解决方法):https://social.msdn.microsoft.com/Forums/en-US/56272bc6-6085-426a-8939-f48d71ab12ca/page-keydown-event-not-firing?forum=winappswithcsharp

总之,根据该帖子,该事件不会被激发,因为当对TextBox的焦点丢失时,它会向上传递,因此Grid无法获得它。应该使用Window.Current.CoreWindow.KeyDown代替。我已将事件处理程序添加到页面加载的事件中,如下所示:

private void Page_Loaded(object sender, RoutedEventArgs e)
{
    Window.Current.CoreWindow.KeyDown += coreWindow_KeyDown;
    Window.Current.CoreWindow.KeyUp += CoreWindow_KeyUp;
}

这对我有用。

答案 1 :(得分:3)

这是奇怪的。这显然是一个焦点问题,我仍然无法理解为什么网格不采取焦点,即使我们点击它。

虽然有一种解决方法:为网格的已加载事件创建处理程序:

<Grid x:Name="theGrid" KeyDown="Grid_KeyDown_1" Focusable="True" Loaded="TheGrid_OnLoaded">

然后强制关注你的代码:

    private void TheGrid_OnLoaded(object sender, RoutedEventArgs e)
    {
        theGrid.Focus();
    }

之后你的keydown事件会有效。 希望它有所帮助。

答案 2 :(得分:2)

我尝试使用Focus Method也无济于事,直到我将Focusable属性设置为true(默认为False。)