KeyDown事件不会从UWP中的选定网格触发

时间:2019-11-18 06:09:55

标签: c# uwp keydown onkeydown

我正在使用自定义控件(如日历),在该控件中有一个面板作为月视图,其中网格单元格排列为日期单元格。网格具有一个内容呈现器,其中TextBlock作为内容模板。一切正常。 Pointerpressed,pointerReleased和OnTapped重写方法在Grid上正常工作,但是OnKeyDown重写方法或KeyDown事件不会从中触发。我也尝试过使用PreviewKeyDown。请帮助我解决这个问题。

2 个答案:

答案 0 :(得分:1)

  

KeyDown事件不会从UWP中的选定网格触发

问题在于网格未聚焦,因此将不会按预期触发事件。更好的方法是监听CoreWindow KeyDown事件,因为当应用在前台运行时,CoreWindow将自动聚焦。

Window.Current.CoreWindow.KeyDown += CoreWindow_KeyDown;
private void CoreWindow_KeyDown(Windows.UI.Core.CoreWindow sender, Windows.UI.Core.KeyEventArgs args)
{
   MyBlock.Text = args.VirtualKey.ToString();
}

答案 1 :(得分:1)

键按下事件仅从键盘焦点控制触发。网格不是控件,而网格是面板。在UWP中,只有控件可以设置焦点。

您可以编写一个空控件并将其添加到Grid中以设置控件焦点。

class Foo : Control
{
    protected override void OnKeyDown(KeyRoutedEventArgs e)
    {
        Debug.WriteLine("Foo key down");
    }
}

    <Grid x:Name="Grid2" Margin="10,10,10,10" Width="100" Background="#565656" HorizontalAlignment="Right" 
          KeyDown="Grid2_OnKeyDown">
        <local:Foo x:Name="Foo"></local:Foo>
    </Grid>

当Grid2键按下时,您可以编写任何代码来帮助调试。

    private void Grid2_OnKeyDown(object sender, KeyRoutedEventArgs e)
    {
        Debug.WriteLine("Grid2 key down");
    }

然后您可以在单击Grid2时设置Foo属性焦点。

    private async void Grid2_OnPointerReleased(object sender, PointerRoutedEventArgs e)
    {
        await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { Foo.Focus(FocusState.Keyboard); });
    }

尝试运行代码,当您单击Grid2并按键时,您会看到输出窗口显示该消息。

但是为什么要用调度程序编写代码,因为我应该使Foo控件获得焦点。而且,如果我不使用调度程序,则指针焦点将位于Grid中,而不是任何UIElement焦点键盘中。