Как включить горизонтальную прокрутку и отключить вертикальную прокрутку в средстве просмотра прокрутки в UWP? - PullRequest
0 голосов
/ 26 сентября 2019

Вот 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 (чтобы получить правильный горизонтальный эффект), я теряю нужный вертикальный эффект.

Меня не очень волнует, если я заставлю всех использовать полосу прокрутки для горизонтальной прокрутки, но это было бы бонусом, если бы мне не пришлось это делать.

Я нашел эту запись, которая, казалось, была тем, что я искал, но я не мог понятьэквивалент UWP (возможно, перенаправление события PointerWheelChanged в parentScrollViewer?)

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

1 Ответ

0 голосов
/ 26 сентября 2019

Я нашел решение, которое мне очень нравится, но я не собираюсь его отмечать (хотя бы некоторое время) в надежде, что у кого-то есть лучшее решение.

Я только что добавил прокручивательс высотой, достаточной для отображения полосы прокрутки, и включил 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;
        }
...