Отмена пробела Нажмите / Нажмите на элементы управления UWP во всем приложении - PullRequest
0 голосов
/ 27 сентября 2018

Когда элемент пользовательского интерфейса (элемент управления) фокусируется в приложении uwp, его можно вызвать с помощью клавиш Пробел или Ввод , это не ограничивается рабочим столом, но также помогает в Xboxтаким образом, пользователь может перемещаться по элементам управления и нажимать на любом сфокусированном элементе управления, чтобы активировать его Command.

вариант использования

Но в моем случае использования я хочу только Введите , чтобы вызвать это поведение, и Пробел не должен делать вообще ничего, какой бы элемент управления не нажимался на экране.

Причина этого требования в том, что я строюприложение MediaPlayer и независимо от того, какой элемент управления или кнопка фокусируется в приложении, когда я нажимаю Пробел Я хочу просто связать его с поведением Воспроизведение / Пауза моего элемента мультимедиа.

Не дубликат

Этот вопрос не является дубликатом: UWP - Не запускать событие Click при нажатии пробела (как в приложении «Фильмы и ТВ»))

Потому что в вопросеКак указано выше, ответ был релевантным только в том случае, если какой-либо из AppBarButtons был сфокусирован, поэтому он ничего не будет делать при нажатии Пробел , а будет вызываться только с помощью Enter .Но в моем случае я хочу применить то же поведение даже вне элемента управления MediaPlayerElement.У меня есть NavigationView и MediaPlayerElement, находящиеся на одной из страниц, поэтому я хочу, чтобы это поведение работало, даже когда NavigationViewItem находится в фокусе или любой другой элемент управления, который может быть сфокусирован и вызван, должен вызываться только с Введите , а не Пробел .

Существует ли решение на уровне приложения, где я могу применить это поведение на самом корневом элементе управления, и оно распространяется на всех его дочерних элементов, т. Е. На целое приложение?

То, что я пробовал

Я пытался ответить на уже отвеченный вопрос (ссылка выше), и это прекрасно работает для ограниченного сценария.И я также попытался установить AllowFocusOnInteraction=false для каждой кнопки панели приложения, а также другие дополнительные элементы управления, которые у меня есть в стиле моего CustomMediaTransportControls.Но это также ограничено только MediaPlayerElement и также предотвращает навигацию по вкладкам, что не очень удобно для доступа.

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Есть много способов приблизиться, Вы можете прослушать текущее Content PreviewKeyDown событие, чтобы обнаружить Пробел нажатие.

public Scenario1()
{
    this.InitializeComponent();
    Window.Current.Content.PreviewKeyDown += Content_PreviewKeyDown;  
}

private void Content_PreviewKeyDown(object sender, KeyRoutedEventArgs e)
{
    e.Handled = e.Key == VirtualKey.Space ? true : false;
}

Вы также можете использовать GLOBAL HOTKEY для своего приложения uwp, которое можно использовать, когда окно вашего приложения не на переднем плане.Для большего схода с рельсов вы можете проверить этот блог .

0 голосов
/ 28 сентября 2018

Это можно сделать, обработав событие PreviewKeyDown выше в иерархии визуальных деревьев, например, в Page.

Подписаться на событие в конструкторе Page:

public MainPage()
{
    this.InitializeComponent();
    this.PreviewKeyDown += MainPage_PreviewKeyDown;            
}

Или в XAML:

<Page ... PreviewKeyDown="MainPage_PreviewKeyDown">

И в обработчике событий установите KeyRoutedEventArgs на обработку при нажатии клавиши Пробел :

private void MainPage_PreviewKeyDown(object sender, KeyRoutedEventArgs e)
{
    if (e.Key == VirtualKey.Space)
    {
        e.Handled = true;
    }
}

Таким образом, событие нажатия клавиши никогда не достигнет какого-либо элемента управления ниже в иерархии, поскольку событие PreviewKeyDown распространяет дерево до того, как событие произойдет.

...