2012-05-24 1 views
2

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

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

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

Как управлять я, чтобы решить эту проблему?

часть 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> 
+0

Но колесо мыши должно работать только с GridView по умолчанию? Если вы создаете приложение Grid - это должно просто работать ... –

+0

извините, но этот ответ не поможет. я использую внешний gridview в семантическом зум-объекте, а внутренний - для элементов прокрутки. – burusera

+1

Из того, что я помню, это просто работает, но то, что вы делаете, совершенно неверно. Вы меняете шаблон управления GridView на то, что не хватает всех частей шаблона, ожидаемых GridView, включая ScrollViewer. –

ответ

0

UPDATE: извините, я неправильно вопрос. Если вы поместите GridView в GridView, у вас есть вложенные ScrollViewers, и вам действительно нужен этот код во внутренней грид-панели или прокрутка мыши.

Однако почему вы гнездо GridViews в 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, так что нет никаких конфликтов с двух ScrollViewers вложенными друг в друга, и один ScrollViewer автоматически обрабатывает мышь.

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

0

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

<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> 
+0

Вы неправильно прочитали мой вопрос. Я не вижу внутреннего gridview в вашем коде. и где проносится? – burusera

+0

Не имеет смысла вставлять GridViews. Что вы имеете в виду, проверив? В GridView есть шаблон ScrollViewer в шаблоне, поэтому вы всегда можете прокручивать, если содержимое не подходит на экране. –

+0

Извините, я действительно неправильно понял часть вашего вопроса - если вы имеете в виду перекрестный выбор для выбора функциональности - тогда он должен работать в GridView, если SelectionMode не установлен в None и IsSwipeEnabled = «True», но он, вероятно, t, если вы вставляете GridViews, так что мой ответ по-прежнему остается верным - если вы можете объяснить, чего вы пытаетесь достичь с помощью макета или почему вы хотите вложить GridViews, вы можете получить лучший ответ. –

2

Это стиль работы 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> 
1

Если вы повторно-шаблон на 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