KeyDown event not raising from a grid
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. )
Comments
-
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 over 11 yearsThat'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 over 11 yearsI have multiple windows, it wouldn't be right thing to make them all focused
-
Davide Dolla about 7 yearsI 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 onOnNavigatedFrom
-
NielW over 6 yearsAha! That's what I was missing. Thank you