Прокрутка UWP XAML ScrollViewer с помощью клавиш со стрелками - PullRequest
0 голосов
/ 27 июня 2018

У меня есть простой код на XAML и главная страница:

<Grid>
    <ScrollViewer ZoomMode="Enabled" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
        <Image Source="Assets/skyline.jpg" KeyDown="Image_KeyDown">

        </Image>
    </ScrollViewer>
</Grid>

Когда я сейчас запускаю программу, я могу прокручивать с помощью сенсорной панели, но не с помощью клавиш со стрелками на клавиатуре. Почему это так и как я могу изменить это поведение? Я задаю этот вопрос, потому что у меня есть гораздо более сложный пример, где он просто работает (конечно, этот пример не только изображение). Спасибо!

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

ScrollViewer реагирует на необработанные события клавиатуры, которые всплывают из его содержимого. В вашем примере вы не видите прокрутки клавиатуры, потому что ни Image, ни ScrollViewer не являются фокусируемыми, что означает, что не будет никаких событий клавиатуры, которые всплывают или исходят из ScrollViewer. Image происходит от FrameworkElement, который не имеет понятия фокуса. ScrollViewer может получить фокус. Но по умолчанию это не так, потому что его стиль управления по умолчанию имеет IsTabStop = "False".

Простое решение здесь - установить IsTabStop = "True" на ScrollViewer. Теперь, когда его можно сфокусировать, вы начнете видеть вокруг ScrollViewer толстого прямоугольного фокуса, автоматически нарисованного системой. Вы можете отключить это, также установив UseSystemFocusVisuals="False".

В разметке ...

<ScrollViewer x:Name="scrollviewer"
              IsTabStop="True" UseSystemFocusVisuals="False"
              ZoomMode="Enabled" HorizontalScrollBarVisibility="Auto"  VerticalScrollBarVisibility="Auto">
    <Image Source="Assets/skyline.jpg">
    </Image>
</ScrollViewer>

Примечание : Это необходимо только потому, что в контенте нет ничего, что могло бы привлечь внимание. В более сложных сценариях у вас часто будет что-то в ScrollViewer, на которое можно сфокусироваться (например, кнопка «foo»). В этих сценариях прокрутка происходит с помощью клавиатуры, как и следовало ожидать, потому что у некоторого 'foo' есть фокус.

0 голосов
/ 29 июня 2018

Вы можете использовать ChangeView метод ScrollViewer для прокрутки в Window.Current.CoreWindow.KeyDown обработчике событий.

Пожалуйста, обратитесь к следующему примеру кода:

<ScrollViewer x:Name="scrollviewer" ZoomMode="Enabled" HorizontalScrollBarVisibility="Auto"  VerticalScrollBarVisibility="Auto">
        <Image Source="Assets/skyline.jpg">
        </Image>
</ScrollViewer>
public MainPage()
{
    this.InitializeComponent();
    Window.Current.CoreWindow.KeyDown += CoreWindow_KeyDown;
}
private double horizontalOffset;
private double verticalOffset;
private double step = 5;
private void CoreWindow_KeyDown(Windows.UI.Core.CoreWindow sender, Windows.UI.Core.KeyEventArgs args)
{
    Debug.WriteLine("horizontalOffset: "+horizontalOffset+ " verticalOffset: "+verticalOffset);

    switch (args.VirtualKey)
    {

            case Windows.System.VirtualKey.Left: horizontalOffset = horizontalOffset-step<0 ? 0:horizontalOffset - step; scrollviewer.ChangeView(horizontalOffset,verticalOffset,1);  break;
            case Windows.System.VirtualKey.Right: horizontalOffset = horizontalOffset+step>scrollviewer.ScrollableWidth?scrollviewer.ScrollableWidth: horizontalOffset + step; scrollviewer.ChangeView(horizontalOffset,verticalOffset,1);break;
            case Windows.System.VirtualKey.Up: verticalOffset= verticalOffset - step < 0?0:verticalOffset- step; scrollviewer.ChangeView(horizontalOffset,verticalOffset,1);break;
            case Windows.System.VirtualKey.Down: verticalOffset = verticalOffset + step > scrollviewer.ScrollableHeight?scrollviewer.ScrollableHeight:verticalOffset+ step; scrollviewer.ChangeView(horizontalOffset,verticalOffset,1);break;
            default: break;
    }
}
...