这里我有一个带网格的示例窗口。我需要在按下按键时捕获事件。但是当我点击网格区域然后按键时它不会升起。它只有在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>
答案 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。)