ScrollViewer.ChangeView () не прокручивается по горизонтали

Я пытаюсь создать два средства просмотра прокрутки, которые прокручиваются по вертикали и горизонтали соответственно.

Прокрутка должна начинаться при обнаружении события манипуляции дельта, и я использовал метод ChangeView, чтобы соответствующим образом переместить средства просмотра прокрутки. Вертикальная прокрутка подходит, но не горизонтальная. Я добавил изображение, чтобы показать 2 средства просмотра прокрутки, так как я не могу опубликовать его правильно здесь.

Вот код: XAML

   <!--horizontal scrollviewer--> 
   <ScrollViewer x:Name="horizontalScrollViewer" 
                  Grid.Column="1"
                  Grid.RowSpan="3"
                  HorizontalScrollMode="Disabled"
                  VerticalScrollMode="Disabled">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="80"/>
                <RowDefinition Height="100"/>
                <RowDefinition Height="80"/>
            </Grid.RowDefinitions>
            <!--upperGrid-->
            <GridView Grid.Row="0"
                      ScrollViewer.HorizontalScrollMode="Disabled"
                      ScrollViewer.VerticalScrollMode="Disabled"
                      ItemsSource="{Binding dataItems}">
                <GridView.ItemsPanel>
                    <ItemsPanelTemplate>
                        <VariableSizedWrapGrid Orientation="Vertical"
                                           MaximumRowsOrColumns="1"/>
                    </ItemsPanelTemplate>
                </GridView.ItemsPanel>
                <GridView.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Height="80" Width="80" Text="{Binding}"/>
                    </DataTemplate>
                </GridView.ItemTemplate>
            </GridView>
            <!--bottomGrid-->
            <GridView Grid.Row="2"
                      ScrollViewer.HorizontalScrollMode="Disabled"
                      ScrollViewer.VerticalScrollMode="Disabled"
                      ItemsSource="{Binding dataItems}">
                <GridView.ItemsPanel>
                    <ItemsPanelTemplate>
                        <VariableSizedWrapGrid Orientation="Vertical"
                                           MaximumRowsOrColumns="1"/>
                    </ItemsPanelTemplate>
                </GridView.ItemsPanel>
                <GridView.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Height="80" Width="80" Text="{Binding}"/>
                    </DataTemplate>
                </GridView.ItemTemplate>
            </GridView>
            
        </Grid>
    </ScrollViewer>
    

и .cs

    private void dataGrid_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
    {
         var x = e.Delta.Translation.X;
        var y = e.Delta.Translation.Y;
        if(Math.Abs(x)> Math.Abs(y))
        {

            bool result = horizontalScrollViewer.ChangeView( horizontalScrollViewer.HorizontalOffset - x , null, null);
            result = centralScrollViewer.ChangeView(horizontalScrollViewer.HorizontalOffset - x, null, null);
            
        }
        else
        {
            bool result = centralScrollViewer.ChangeView(null, verticalScrollViewer.VerticalOffset -y, null);
            verticalScrollViewer.ChangeView(null, verticalScrollViewer.VerticalOffset - y, null);
                            
        }
    }

В документации msdn я прочитал, что:

horizontalOffset Тип: IReference [C ++] | System.Nullable [.NET] Значение от 0 до ScrollableWidth, которое определяет расстояние, на которое контент ›должен прокручиваться по горизонтали.

но мой ScrollableWidth равен нулю, и я не могу понять почему.

Кто-нибудь знает, что не так с моим кодом?


person Aenima    schedule 17.09.2015    source источник


Ответы (2)


Сам нашел решение!

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

<ScrollViewer x:Name="horizontalScrollViewer" 
                  Grid.RowSpan="3"
                  Grid.Column="1"
                  HorizontalScrollMode="Disabled"
                  HorizontalScrollBarVisibility="Auto"
                  VerticalScrollMode="Disabled">
person Aenima    schedule 17.09.2015

Я не думаю, что вы можете прокручивать, когда прокрутка отключена. Если вы просто пытаетесь скрыть полосы прокрутки, сделайте следующее:

<ScrollViewer x:Name="horizontalScrollViewer" 
                  Grid.Column="1"
                  Grid.RowSpan="3"
                  HorizontalScrollMode="Enabled"
                  VerticalScrollMode="Enabled"
                  HorizontalScrollBarVisibility="Hidden"
                  VerticalScrollBarVisibility="Hidden">
...
</ScrollViewer>
person Laith    schedule 17.09.2015
comment
нет, это не моя цель. Вертикальная прокрутка точно такая же, и она работает. Для моей цели я не могу использовать прокрутку scrollviewer, мне нужно обнаружить событие манипуляции в сетке, а затем программно прокрутить элементы, используя метод ChangeView. К сожалению, для горизонтальной прокрутки он не работает - person Aenima; 17.09.2015