代码之家  ›  专栏  ›  技术社区  ›  A. Schmidt

uwp xaml滚动查看器使用箭头键滚动

  •  0
  • A. Schmidt  · 技术社区  · 6 年前

    我在XAML和主页上有一个简单的代码:

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

    当我现在开始编程时,我可以用触摸板滚动,但不能用键盘上的箭头键滚动。为什么会这样?我怎样才能改变这种行为?我之所以问这个问题,是因为我有一个更复杂的例子,它在哪里工作(当然,这个例子不仅仅是一个图像)。谢谢您!

    2 回复  |  直到 6 年前
        1
  •  1
  •   Micah Lewis    6 年前

    这个 ScrollViewer 响应从其内容中冒泡出来的未处理键盘事件。在您的示例中,您没有看到键盘滚动,因为 Image 也不是 滚动条 是否可聚焦,这意味着不会有任何键盘事件冒泡或源自 滚动条 . 图像 来源 FrameworkElement 它没有焦点的概念。滚动条 能够 接收焦点。但是,默认情况下,它不是因为它的默认控件样式 IsTabStop = "False" .

    这里的简单解决方案是 IsTabStop = "True" 滚动条 .现在它可以聚焦,你可以看到 滚动条 系统自动绘制的厚焦点矩形。您也可以通过设置 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”有焦点。

        2
  •  0
  •   Xie Steven    6 年前

    你可以使用 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;
        }
    }