如何在 UWP 的滚动查看器中启用水平滚动和禁用垂直滚动?

How do I enable horizontal scroll and disable vertical scroll within a scrollviewer in UWP?

这是我开始的XAML:

<ScrollViewer Height="500"
              Width="500"
              Name="parentScrollViewer">
        <StackPanel>
            <Grid Height="300"
                  Background="Red" />

            <ScrollViewer Width="500"
                          HorizontalScrollBarVisibility="Auto"
                          Name="childScrollViewer">
                <Grid Height="300"
                      Width="600"
                      Background="Green"/>
            </ScrollViewer>
            <Grid Height="300"
                  Background="Blue" />        
        </StackPanel>
</ScrollViewer>

基本上,如果我在 childScrollViewer 上禁用所有滚动,我会得到我想要的垂直效果(parentScrollViewer 可以滚动所有内容),但是如果我在 childScrollViewer 上启用水平滚动(以获得正确的水平效果),我松开我想要的垂直效果。

我真的不在乎是否必须让每个人都使用滚动条来水平滚动,但如果我不必那样做,那将是一个奖励。

我找到了 post,这似乎是我要找的东西,但我无法找出 UWP 等效项(也许将 PointerWheelChanged 事件重定向到 parentScrollViewer?)

或者,当且仅当触摸滚动条(或按下鼠标)时,我研究了启用水平滚动,但我找不到要监听的正确事件。

我找到了一个我觉得很不错的解决方案,但我不打算(至少暂时)标记它,希望有人有更好的解决方案。

我刚刚添加了一个高度刚好足以显示滚动条的滚动查看器,并在触摸时启用了 childScrollViewer。

这是我的 XAML:

<ScrollViewer Height="500"
                  Width="500"
                  Name="parentScrollViewer">
        <StackPanel>
            <Grid Height="300"
                  Background="Red" />
            <ScrollViewer Width="500"
                          HorizontalScrollMode="Disabled"
                          HorizontalScrollBarVisibility="Hidden"
                          Name="childScrollViewer"
                          PointerPressed="ChildScrollViewer_PointerPressed"
                          PointerReleased="ChildScrollViewer_PointerReleased"
                          PointerExited="ChildScrollViewer_PointerReleased"
                          >

                <Grid Height="300"
                      Width="600"
                      Background="Green">
                    <TextBlock Text="left"
                               HorizontalTextAlignment="Left" />
                    <TextBlock Text="right"
                               HorizontalTextAlignment="Right" />

                </Grid>
            </ScrollViewer>
            <ScrollViewer Width="500"
                          HorizontalScrollBarVisibility="Auto"
                          Name="childScrollViewer2"
                          ViewChanged="ScrollViewer_ViewChanged">

                <Grid Height="16"
                      Width="600"
                      Background="Green">

                </Grid>
            </ScrollViewer>
            <Grid Height="300"
                  Background="Blue" />
        </StackPanel>
    </ScrollViewer>

这是我的 C#:

        private void ChildScrollViewer_PointerPressed(object sender, PointerRoutedEventArgs e)
        {
            childScrollViewer.HorizontalScrollMode = ScrollMode.Enabled;
        }

        private void ChildScrollViewer_PointerReleased(object sender, PointerRoutedEventArgs e)
        {
            childScrollViewer.HorizontalScrollMode = ScrollMode.Disabled;
        }

        private void ScrollViewer_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
        {
            if (!(sender is ScrollViewer s))
            {
                return;
            }
            childScrollViewer.HorizontalScrollMode = ScrollMode.Enabled;
            childScrollViewer.ChangeView(s.HorizontalOffset, null, null);
            childScrollViewer.HorizontalScrollMode = ScrollMode.Disabled;
        }