Проблема с залипанием прокрутки в элементе управления WinRT XAML GridView

У меня есть очень простой элемент управления GridView, определенный на странице приложения Магазина Windows, который выглядит следующим образом:

    <GridView
        x:Name="myGridView"
        Grid.RowSpan="2"
        Padding="30,137,40,46"
        ItemsSource="{Binding Source={StaticResource myItemsViewSource}}"
        ItemTemplate="{StaticResource My500x500ItemTemplate}"
        SelectionMode="Multiple"
        IsSwipeEnabled="True"
        IsItemClickEnabled="True">

        <GridView.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </GridView.ItemsPanel>
        <GridView.GroupStyle>
            <GroupStyle>
                <GroupStyle.HeaderTemplate>
                    <DataTemplate>
                        <Grid Margin="1,0,0,6">
                            <Button
                            Style="{StaticResource TextPrimaryButtonStyle}">
                                <StackPanel Orientation="Horizontal">
                                    <TextBlock Text="{Binding Title}" Margin="3,-7,10,10" Style="{StaticResource GroupHeaderTextStyle}" />
                                    <TextBlock Text="{StaticResource ChevronGlyph}" FontFamily="Segoe UI Symbol" Margin="0,-7,0,10" Style="{StaticResource GroupHeaderTextStyle}"/>
                                </StackPanel>
                            </Button>
                        </Grid>
                    </DataTemplate>
                </GroupStyle.HeaderTemplate>
                <GroupStyle.Panel>
                    <ItemsPanelTemplate>
                        <VariableSizedWrapGrid/>
                    </ItemsPanelTemplate>
                </GroupStyle.Panel>
            </GroupStyle>
        </GridView.GroupStyle>
    </GridView>

Во время выполнения данные, привязанные к myItemsViewSource, появляются в элементе управления GridView, как я и ожидал.

Однако у меня возникает странная проблема с прокруткой, когда в источнике данных больше элементов, чем может быть отображено на экране. Полоса прокрутки, кажется, «сопротивляется» моим усилиям по прокрутке коллекции и лишь слегка перемещает область просмотра, пока она не «вырвется на свободу», и я не смогу прокрутить остальные элементы:

демонстрация проблемы с прокруткой  правильно

демонстрация плавной прокрутки  вне мертвой точки

То же самое происходит и на обратном пути, справа налево: прокрутка происходит плавно, пока я не подхожу достаточно близко к началу прокручиваемой области, где она снова «застревает»:

демонстрация проблемы с прокруткой  слева

Думая, что проблема как-то связана с виртуализацией, я попытался изменить ItemsPanel для GridView на StackPanel вместо VirtualizingStackPanel, но это имело еще худший эффект, так как ни один из элементов не отображался. Примечание: GridView не размещается ни в какой другой области прокрутки или холсте.

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


person Cameron Flint    schedule 11.11.2012    source источник
comment
У меня та же проблема. Я предполагаю, что проблема связана с неправильно рассчитанным внутренним шаблоном элемента. На самом деле, полоса прокрутки не только липкая, но и меняет свой размер дюйм за дюймом.   -  person Youngjae    schedule 04.01.2013


Ответы (3)


Вы должны удалить левое поле и отступ в фактическом GridView и добавить его в объявление ItemsPanel. Немного сбивает с толку, поскольку шаблон по умолчанию имеет отступы, установленные в представлении сетки.

Вот начало GridView, который поставляется с шаблоном по умолчанию, с моим изменением заполнения элемента управления GridView и поля, установленного в объявлении VirtualizingStackPanel ItemsPanel.

<GridView
        x:Name="itemGridView"
        AutomationProperties.AutomationId="ItemGridView"
        AutomationProperties.Name="Grouped Items"
        Grid.RowSpan="2"
        Padding="0,137,40,46"
        ItemsSource="{Binding Source={StaticResource groupedItemsViewSource}}"
        ItemTemplate="{StaticResource Standard250x250ItemTemplate}"
        SelectionMode="None"
        IsSwipeEnabled="false"
        IsItemClickEnabled="True"
        ItemClick="ItemView_ItemClick">

        <GridView.ItemsPanel>
            <ItemsPanelTemplate>                        
                <VirtualizingStackPanel Margin="116,0,0,0" Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </GridView.ItemsPanel>
person Ant    schedule 17.01.2013
comment
Спасибо, это сделало то же самое, не влияя на смещение полосы прокрутки. - person Cameron Flint; 20.01.2013
comment
Если вы можете протестировать устройство с сенсорным экраном (планшет Win8 или Lenovo ThinkPad x230t, как я), прокручиваемая область отличается (прокрутка с помощью мыши обеспечивает большую ширину ...?). Более того, когда пользователь проводит касанием GridView в крайнее правое положение, GridView слегка дрожит. - person Youngjae; 07.02.2013

Удаление свойства GridView.Padding и замена его на GridView.Margin решает проблему "залипания прокрутки":

    <GridView
        x:Name="myGridView"
        Grid.RowSpan="2"
        Margin="30,137,40,46" <!-- replaced 'Padding' with 'Margin' -->
        ItemsSource="{Binding Source={StaticResource myItemsViewSource}}"
        ItemTemplate="{StaticResource My500x500ItemTemplate}"

        ...

Однако это меня озадачивает, поскольку в шаблоне проекта Visual Studio GridView используется Padding, а не Margin.

Кто-нибудь знает более удовлетворительное решение?

Изменить: удалено вводящее в заблуждение утверждение.

person Cameron Flint    schedule 11.11.2012
comment
Изменение от заполнения к полю также перемещает положение полосы прокрутки внизу. Есть ли возможность предотвратить перемещение полосы прокрутки? - person Unknown1987; 07.01.2013

Проблема в том,

<VirtualizingStackPanel Margin="116,0,0,0" Orientation="Horizontal"/>

Измените это на: <StackPanel Margin="116,0,0,0" Orientation="Horizontal"/>

person Evox    schedule 07.09.2013
comment
И вы бы потеряли виртуализацию :-). Да, это решение, но не решение, если вы хотите сохранить производительность. Основная проблема на самом деле является известной проблемой в сценарии, которая была исправлена ​​в Windows 8.1. - person Tim Heuer; 09.09.2013