Я работаю над настраиваемым элементом управления, таким как календарь, где у меня есть панель в виде представления месяца, в котором ячейки сетки упорядочены как ячейки даты. В сетке есть презентатор содержимого с TextBlock в качестве шаблона содержимого. Все работает нормально. Методы переопределения Pointerpressed, pointerReleased и OnTapped работают нормально для Grid, но метод переопределения OnKeyDown или событие KeyDown не запускаются из него. Я также пробовал с PreviewKeyDown. Пожалуйста, помогите мне решить эту проблему.
Событие KeyDown не запускается из выбранной сетки в UWP
Ответы (2)
Событие нажатия клавиши запускается только из элемента управления, ориентированного на клавиатуру. И сетка - это не элемент управления, а сетка - это панель. В UWP фокус может быть установлен только на элементе управления.
Вы можете написать пустой элемент управления и добавить его в сетку, чтобы установить фокус элемента управления.
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");
}
А затем вы можете установить фокус свойства Foo при нажатии Grid2.
private async void Grid2_OnPointerReleased(object sender, PointerRoutedEventArgs e)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { Foo.Focus(FocusState.Keyboard); });
}
Попробуйте запустить код, и вы увидите, что в окнах вывода отображается сообщение, когда вы щелкаете Grid2 и нажимаете клавишу.
Но почему я пишу код в диспетчере, потому что я должен сделать так, чтобы элемент управления Foo был в фокусе. И если я не использую диспетчер, и фокус указателя будет в Grid, а не на какой-либо клавиатуре с фокусом UIElement.
Событие KeyDown не запускается из выбранной сетки в UWP
Проблема в том, что сетка не была сфокусирована, поэтому событие не будет запущено, как ожидалось. Лучше всего слушать _1 _ 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();
}