Событие KeyDown не запускается из выбранной сетки в UWP

Я работаю над настраиваемым элементом управления, таким как календарь, где у меня есть панель в виде представления месяца, в котором ячейки сетки упорядочены как ячейки даты. В сетке есть презентатор содержимого с TextBlock в качестве шаблона содержимого. Все работает нормально. Методы переопределения Pointerpressed, pointerReleased и OnTapped работают нормально для Grid, но метод переопределения OnKeyDown или событие KeyDown не запускаются из него. Я также пробовал с PreviewKeyDown. Пожалуйста, помогите мне решить эту проблему.


person Karthik Raja AKR    schedule 18.11.2019    source источник
comment
не могли бы вы поделиться своим кодом. чтобы мы могли вам помочь   -  person    schedule 18.11.2019


Ответы (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.

person lindexi    schedule 18.11.2019

Событие 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();
}
person Nico Zhu - MSFT    schedule 18.11.2019
comment
Да, нормально работает. Но это влияет на поведение календаря. Календарь будет частью окна. Таким образом, событие нажатия клавиши будет запускаться в любое время при нажатии клавиши, даже если календарь не трогается. Есть ли способ вызвать его из сетки? - person Karthik Raja AKR; 18.11.2019
comment
Почему Грид не был опубликован? Поскольку сетка не является элементом управления, и сфокусироваться можно только на элементе управления. - person lindexi; 18.11.2019
comment
@lindexi, это отличное объяснение, спасибо за дополнение. - person Nico Zhu - MSFT; 19.11.2019