KeyDown event not raising from a grid

13,717

Solution 1

Right this is weird. This is clearly a focus problem, still I can not understand why the grid do not take Focus, even when we click on it.

Though there is a workaround: create an handler for the loaded event of the grid:

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

And then force focus in your code behind:

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

Your keydown event will work after that. Hope it helps.

Solution 2

I had the same issue with a Universal Windows Platform (UWP) app. I attached the event to a grid in XAML but it would only work when the focus was on the TextBox. I found the answer (not just a workaround) on MSDN: https://social.msdn.microsoft.com/Forums/en-US/56272bc6-6085-426a-8939-f48d71ab12ca/page-keydown-event-not-firing?forum=winappswithcsharp

In summary, according to that post, the event won't fire because when focus to the TextBox is lost, it's passed higher up so the Grid won't get it. Window.Current.CoreWindow.KeyDown should be used instead. I've added my event handlers to the page loaded event like this:

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

This works as expected for me.

Solution 3

I tried using the Focus Method too, to no avail, until I set the Focusable property to true ( It was default to False. )

Share:
13,717
Dork
Author by

Dork

rascal, miserable dev.

Updated on June 30, 2022

Comments

  • Dork
    Dork almost 2 years

    Here I have sample window with a grid. I need to capture event when key is pressed. But it is not raising when I click grid area and then press key. It will work only if Textbox is focused. I know it will work if I capture it from Window. But I have other application with few usercontrols and I need to capture it from distinct ones. I tried to set Focusable.false for Window and true for Grid but it not helps. Any solutions?

    <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>
    

  • Dork
    Dork over 11 years
    That's better but in my real application it fires keydown event from every usercontrol though I hooked it to only one. I have to investigate..
  • Dork
    Dork over 11 years
    I have multiple windows, it wouldn't be right thing to make them all focused
  • Davide Dolla
    Davide Dolla about 7 years
    I think this answer told the best way to respond to the answer. It work on every situation. NOTE: I suggest to add event handler on OnNavigatedTo and DON'T FORGET to remove the handler on OnNavigatedFrom
  • NielW
    NielW over 6 years
    Aha! That's what I was missing. Thank you