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