wpf KeyDown事件不是从网格引发的

3htmauhk  于 2022-11-18  发布在  其他
关注(0)|答案(4)|浏览(214)

这里我有一个带网格的示例窗口。我需要在按下键时捕获事件。但是当我单击网格区域然后按下键时,它不会引发。只有当文本框具有焦点时,它才能工作。我知道如果我从窗口捕获它,它会工作。但是我有其他用户控件很少的应用程序,我需要从不同的控件捕获它。我尝试设置为可聚焦。对于Window为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>
uwopmtnx

uwopmtnx1#

这很奇怪。这显然是一个焦点问题,我仍然不明白为什么网格不采取焦点,甚至当我们点击它。
尽管有一个解决方法:为网格的loaded事件创建一个处理程序:

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

然后在代码后面强制焦点:

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

您的keydown事件将在此之后工作。希望它有帮助。

dauxcl2d

dauxcl2d2#

我在使用通用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来代替。我已经将事件处理程序添加到page loaded事件中,如下所示:

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

这对我来说和预期的一样有效。

2nbm6dog

2nbm6dog3#

我也尝试过使用Focus方法,但没有效果,直到我将Focusable属性设置为true(默认设置为False)。

cwdobuhd

cwdobuhd4#

我遇到了同样的问题,我使用了PreviewKeyDown事件,它对我很有效。

相关问题