10

在这里,我有一个带有网格的示例窗口。我需要在按下键时捕获事件。但是当我单击网格区域然后按键时它没有升高。只有当文本框被聚焦时它才会起作用。我知道如果我从 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>

4

3 回答 3

8

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

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

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

然后将注意力集中在你的代码后面:

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

之后,您的 keydown 事件将起作用。希望能帮助到你。

于 2013-03-06T07:47:23.557 回答
7

我在使用通用 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;
}

这对我来说按预期工作。

于 2015-11-16T12:32:20.180 回答
3

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

于 2017-08-13T05:48:16.033 回答