Стиль Metro: Прокрутка колесом мыши

У меня есть gridview в gridview и я хочу реализовать функцию прокрутки колесика мыши. Поэтому я добавил этот блок во внутреннюю сетку.

<GridView.Template>
  <ControlTemplate >
    <ItemsPresenter />
  </ControlTemplate>
</GridView.Template>

Но в этом случае прокрутка не работает

Как мне удается решить эту проблему?

часть 2. Постараюсь более подробно описать эту ситуацию. У меня есть главный экран, который должен реализовать функциональность, аналогичную главному экрану в Windows 8. Его нужно увеличивать/уменьшать. Вот почему я использую SenaticZoom. В ZoomIn я помещаю GridView, который содержит элементы управления. Элемент управления содержит собственный GridView (мне нужно реализовать функцию прокрутки). Я не знаю, как изменить эти файлы xaml. Какие-либо предложения? Код управления:

<GridView


 x:Name="iGridView"

            Margin="120,0,0,0"
                        ItemsSource="{Binding Source={StaticResource ViewSource}}"
                        ItemTemplateSelector ="{StaticResource ItemTemplateSelector}"
                        IsItemClickEnabled="True"


                        MinCellHeight = "450"
                        MinCellWidth = "245"
                        IsSwipedEnabled="True"
                        >

                <GridView.Template>
                    <ControlTemplate>
                        <ItemsPresenter />
                    </ControlTemplate>
                </GridView.Template>

                <GridView.ItemsPanel>
                    <ItemsPanelTemplate>
                        <VirtualizingStackPanel Orientation="Horizontal"/>
                    </ItemsPanelTemplate>
                </GridView.ItemsPanel>
                <GridView.GroupStyle>
                    <GroupStyle>
                        <GroupStyle.HeaderTemplate>
                            <DataTemplate>
                                <Grid Margin="0,0,0,20">
                                    <Button

                                        Content="{Binding Title}"
                                        Style="{StaticResource Header}"/>
                                </Grid>
                            </DataTemplate>
                        </GroupStyle.HeaderTemplate>
                        <GroupStyle.Panel>
                            <ItemsPanelTemplate>
                                <VariableSizedWrapGrid VerticalAlignment="Top" Height="550" Orientation="Vertical"/>
                            </ItemsPanelTemplate>
                        </GroupStyle.Panel>
                    </GroupStyle>
                </GridView.GroupStyle>
            </GridView>

и код базовой страницы

<SemanticZoom x:Name="sZoom" VerticalAlignment="Stretch" >
                <SemanticZoom.ZoomedInView>
                    <GridView x:Name="zoomIn" SelectionMode="None"
                                  IsItemClickEnabled="False"
                                  IsSwipeEnabled="False"

                              >
                        <GridView.ItemsPanel>
                            <ItemsPanelTemplate>
                                <StackPanel Orientation="Horizontal" />
                            </ItemsPanelTemplate>
                        </GridView.ItemsPanel>
                        <GridView.ItemContainerStyle>
                            <Style TargetType="GridViewItem">
                                <Setter Property="Template" Value="{StaticResource ItemTemplate}"/>
                            </Style>
                        </GridView.ItemContainerStyle>
                        <local:Control1 x:Name="Control1" />
                       <local:Control1 x:Name="Control2" />
                    </GridView>
                </SemanticZoom.ZoomedInView>

person burusera    schedule 24.05.2012    source источник
comment
Но колесико мыши должно работать только с GridView по умолчанию? Если вы создаете приложение Grid - это должно работать...   -  person Filip Skakun    schedule 24.05.2012
comment
извините, но этот ответ бесполезен. я использую внешний gridview в управлении семантическим масштабированием, а внутренний - для элементов смахивания   -  person burusera    schedule 25.05.2012
comment
Насколько я помню - это просто работает, но то, что вы делаете, совершенно неправильно. Вы меняете шаблон управления GridView на то, в чем отсутствуют все части шаблона, ожидаемые GridView, включая ScrollViewer.   -  person Filip Skakun    schedule 25.05.2012
comment
@FilipSkakun Вам абсолютно необходимо удалить ScrollViewer из шаблона элемента управления GridView, если GridView вложен в другой ScrollViewer. В противном случае внутреннему ScrollViewer не нужно прокручивать, но он все равно использует события колесика мыши. Внешний ScrollViewer выполняет прокрутку, но не получает события колесика мыши, и в результате прокрутка с помощью колесика мыши не работает.   -  person Kris Vandermotten    schedule 26.05.2012
comment
Но зачем помещать GridView в ScrollViewer, если он уже есть? Мне нужно еще раз просмотреть код, чтобы увидеть, как это делается, но я почти уверен, что приведенный выше шаблон неверен.   -  person Filip Skakun    schedule 26.05.2012
comment
Ну, вы бы не поместили один GridView непосредственно в ScrollViewer. Но вы можете поместить его в VirutalizingStackPanel вместе с другими элементами управления и поместить в ScrollViewer.   -  person Kris Vandermotten    schedule 26.05.2012
comment
Крис Вандермоттен, спасибо за совет. Я изменил шаблон для внутренней сетки. Теперь он не содержит ScrollViewer. Кажется, это работает   -  person burusera    schedule 27.05.2012


Ответы (4)


Это рабочий стиль GridView. я удаляю свойство scrollviewr

<Style x:Key="GridViewInGridViewStyle" TargetType="GridView">
    <Setter Property="Padding" Value="0,0,0,10"/>
    <Setter Property="IsTabStop" Value="False"/>
    <Setter Property="TabNavigation" Value="Once"/>
    <Setter Property="IsSwipeEnabled" Value="True"/>
    <Setter Property="ItemContainerTransitions">
        <Setter.Value>
            <TransitionCollection>
                <AddDeleteThemeTransition/>
                <ContentThemeTransition/>
                <ReorderThemeTransition/>
                <EntranceThemeTransition IsStaggeringEnabled="False"/>
            </TransitionCollection>
        </Setter.Value>
    </Setter>
    <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <WrapGrid Orientation="Vertical"/>
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="GridView">
                <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}">
                    <ItemsPresenter HeaderTemplate="{TemplateBinding HeaderTemplate}" Header="{TemplateBinding Header}" HeaderTransitions="{TemplateBinding HeaderTransitions}" Padding="{TemplateBinding Padding}"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
person kaki104    schedule 25.09.2012

Если вы повторно создадите GridView и удалите внутренний ScrollViewer, прокрутка с помощью колесика мыши будет работать, но смахивание для выбора не будет работать. Если вы хотите и то, и другое, хитрость заключается в том, чтобы использовать метод AddHandler() для добавления обработчика события PointerWheelChanged и установить для свойства e.Handled значение false. Это позволит правильно отображать события колесика мыши в вашем внешнем ScrollViewer:

public class CustomGridView : GridView
{
    protected override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        var sv = this.GetTemplateChild("ScrollViewer") as UIElement;
        if (sv != null)
            sv.AddHandler(UIElement.PointerWheelChangedEvent, new PointerEventHandler(OnPointerWheelChanged), true);
    }

    private void OnPointerWheelChanged(object sender, PointerRoutedEventArgs e)
    {
        e.Handled = false;
    }
}

Я реализовал именно этот сценарий, и он работает для меня. Полная информация здесь: http://briandunnington.github.com/gridview-in-a-scrollviewer.html

person briandunnington    schedule 11.12.2012

ОБНОВЛЕНИЕ: извините, я неправильно понял вопрос. Если вы поместите GridView в GridView, у вас есть вложенные ScrollViewers, и вам нужен этот код во внутренних GridViews, или прокрутка колесиком мыши не будет работать.

Однако зачем вкладывать GridView в GridView?

Взгляните на функциональность группировки, встроенную в winrt.

В качестве альтернативы поместите внутренние GridViews в простой ItemsControl с StackPanel с горизонтальной ориентацией в качестве ItemsPanel и этот ItemsControl в ScrollViewer. Если вы размещаете несколько GridViews в ScrollViewer (напрямую или косвенно), вам нужен этот код для удаления ScrollViewer из внутренних (т. е. вложенных) GridViews, иначе прокрутка колесиком мыши не будет работать.

ИСХОДНЫЙ ОТВЕТ:

Этот код необходим, только если вы поместите GridView в ScrollViewer.

Если отображается только GridView, вам не нужно размещать его в ScrollViewer, и вам не нужен этот код.

Я думаю, что ваш реальный вопрос заключается в том, как правильно компоновать GridView, поскольку шаблоны, включенные в бета-версию Visual Studio 11 (из предварительной версии для потребителей), очень плохо справляются с этой задачей.

Попробуй это:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="140"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <Grid>
      <!-- Back button and page title go here -->
    </Grid>

    <GridView x:Name="itemsGridView" Grid.Row="1"
            AutomationProperties.AutomationId="ItemsGridView"
            AutomationProperties.Name="Items"
            ItemsSource="{Binding MyListOfSItems}"
            ItemTemplate="{StaticResource myItemTemplate}">
        <GridView.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapGrid x:Name="itemGridViewPanel" Margin="116,53,116,46"/>
            </ItemsPanelTemplate>
        </GridView.ItemsPanel>
    </GridView>

</Grid>

Теперь есть только один ScrollViewer, т.е. тот, что в GridView, поэтому нет конфликтов от двух вложенных друг в друга ScrollViewer, а один ScrollViewer обрабатывает мышь автоматически.

Кроме того, поля правильные, но при прокрутке элементы могут перемещаться в область полей.

person Kris Vandermotten    schedule 25.05.2012

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

<SemanticZoom>
    <SemanticZoom.ZoomedInView>
        <GridView>
            <GridView.ItemContainerStyle>
                <Style
                    TargetType="GridViewItem">
                    <Setter
                        Property="Width"
                        Value="250" />
                    <Setter
                        Property="Height"
                        Value="250" />
                    <Setter
                        Property="FontSize"
                        Value="32" />
                </Style>
            </GridView.ItemContainerStyle>
            <GridViewItem
                Content="Apple"/>
            <GridViewItem
                Content="Banana" />
            <GridViewItem
                Content="Cherry" />
            <GridViewItem
                Content="Donut" />
            <GridViewItem
                Content="Eggplant" />
            <GridViewItem
                Content="Fig" />
            <GridViewItem
                Content="Grape" />
            <GridViewItem
                Content="Ham" />
            <GridViewItem
                Content="Ice Cream" />
            <GridViewItem
                Content="Jam" />
            <GridViewItem
                Content="Kale" />
            <GridViewItem
                Content="Lemon" />
            <GridViewItem
                Content="Muffin" />
            <GridViewItem
                Content="Nut" />
            <GridViewItem
                Content="Orange" />
            <GridViewItem
                Content="Pear" />
            <GridViewItem
                Content="Raspberry" />
            <GridViewItem
                Content="Steak" />
            <GridViewItem
                Content="Turkey" />
            <GridViewItem
                Content="Udon" />
            <GridViewItem
                Content="Vodka" />
            <GridViewItem
                Content="Wine" />
            <GridViewItem
                Content="Xanthan Gum" />
            <GridViewItem
                Content="Yam" />
            <GridViewItem
                Content="Zucchini" />
        </GridView>
    </SemanticZoom.ZoomedInView>
    <SemanticZoom.ZoomedOutView>
        <GridView
            ItemsSource="ABCDEFGHIJKLMNOPQRSTUVWXYZ">
            <GridView.ItemContainerStyle>
                <Style
                    TargetType="GridViewItem">
                    <Setter
                        Property="Width"
                        Value="400" />
                    <Setter
                        Property="Height"
                        Value="100" />
                    <Setter
                        Property="FontSize"
                        Value="72" />
                </Style>
            </GridView.ItemContainerStyle>
        </GridView>
    </SemanticZoom.ZoomedOutView>
</SemanticZoom>
person Filip Skakun    schedule 27.05.2012
comment
Вы снова неправильно прочитали мой вопрос. Я не вижу внутреннего gridview в вашем коде. а где свайп? - person burusera; 27.05.2012
comment
Нет смысла вкладывать GridViews. Что вы имеете в виду под свайпом? GridView имеет ScrollViewer в шаблоне, поэтому вы всегда можете прокручивать, если содержимое не помещается на экране. - person Filip Skakun; 27.05.2012
comment
Извините, возможно, я действительно неправильно понял часть вашего вопроса - если вы имеете в виду перекрестное смахивание для выбора функций - тогда он должен работать в GridView, если для SelectionMode не установлено значение None и IsSwipeEnabled = True, но, вероятно, это не сработает, если вы вкладываете GridViews, поэтому мой ответ остается верным - если вы можете объяснить, чего вы пытаетесь достичь с помощью своего макета или почему вы хотите вкладывать GridViews - вы можете получить лучший ответ. - person Filip Skakun; 27.05.2012
comment
У меня есть текущая структура: главная страница, которая содержит gridview в semaniczoom и элементы управления, которые находятся в gridview. этот элемент управления использует вид сетки по двум причинам: сгруппированные данные и пролистывание. И я не могу изменить эту структуру. Если я удалю ScrollViewer в GridView, то прокрутка не сработает..... - person burusera; 29.05.2012
comment
Это не поддерживаемый способ поддержки группировки - person Filip Skakun; 29.05.2012
comment
Вы должны проверить этот пример: code.msdn.microsoft.com/windowsapps/GroupedGridView-77c59e8e - в основном вы должны посмотреть на этот файл XAML: >code.msdn.microsoft.com/windowsapps/GroupedGridView-77c59e8e/ — он использует CollectionViewSource, привязанный к GridView, и один GridView для каждого уровня масштабирования элемента управления SemanticZoom. Вложение GridView не может работать должным образом. Вы могли бы сказать, что есть ошибка, если один не работает должным образом при размещении внутри другого, но, вероятно, это просто не поддерживаемый сценарий. - person Filip Skakun; 29.05.2012
comment
я видел эти примеры. Я ИСПОЛЬЗУЮ CollectionViewSource. насколько я понимаю, вы предлагаете мне убрать элементы управления и убрать xaml и код на главную страницу. извините, но это не очень хорошее решение - person burusera; 30.05.2012
comment
Нет, я просто говорю, что вы не должны вкладывать GridViews, а вместо этого использовать встроенный механизм группировки. - person Filip Skakun; 30.05.2012
comment
Только 2 элемента имеют свойство IsSwipeEnabled — GridView и ListView. это все. мне нужно гнездо gridview - person burusera; 30.05.2012
comment
Итак, вы хотите иметь возможность провести пальцем по всей группе, а также по элементу в группе? - person Filip Skakun; 30.05.2012