2012-03-26 4 views
1

Мы пишем приложение для планшетных ПК Windows. Я создал настраиваемый элемент управления, который использует SurfaceScrollViewer для отображения вертикального и прокручиваемого списка справа от окна. Элемент управления использует Adorner, чтобы добавить себя к слою adorner Window, чтобы он мог отображаться поверх содержимого окна.Почему мой SurfaceScrollViewer не перетаскивает прокрутку?

Он работает действительно красиво, но средство просмотра прокрутки по поверхности будет прокручивать только колесо мыши или через полосу прокрутки. Я хотел бы иметь возможность скрывать полосу прокрутки и полагаться на пользователя, который перетаскивает список, но это не работает. Мы использовали элемент управления SurfaceScrollViewer в другом месте этого проекта, и это сработало хорошо, поэтому я предполагаю, что эта проблема сводится к тому, как был создан элемент управления, или, может быть, потому, что он находится в AdornerLayer? Что-то связанное с регистрацией касания поверхности? Странная вещь в том, что элементы управления SurfaceButton в списке работают нормально.

Любая помощь или совет были бы наиболее ценными. Это в основном пользовательский контроль. Я удалил пару привязывающих битов и кусков, чтобы сократить размер, и я добавил окружающие элементы Window/AdornerLayer/Adorner, чтобы поместить его в контекст.

EDIT - Adorner фактически добавлен к слою adorner Grid, который является дочерним элементом Window. Я обновил XAML ниже.

<Window x:Name="Main"> 
    <Grid> 
     <AdornerDecorator> 

      <!-- Adorner layer added to Window in code-behind --> 
      <AdornerLayer> 
       <Adorner> 

        <!-- Custom Control Starts Here --> 
        <Grid x:Name="root" Visibility="Collapsed" Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType=Window}}" Height="{Binding ActualHeight, RelativeSource={RelativeSource AncestorType=Window}}"> 

         <Controls:SurfaceButton x:Name="btnCloser" Opacity="0" Background="White"/> 

         <Grid x:Name="menu" Width="400" HorizontalAlignment="Right" VerticalAlignment="Stretch"> 

          <Grid.RowDefinitions> 
           <RowDefinition Height="20"/> 
           <RowDefinition Height="Auto"/> 
           <RowDefinition Height="20"/> 
           <RowDefinition /> 
           <RowDefinition Height="20"/> 
          </Grid.RowDefinitions> 

          <Border Opacity="0.75" BorderThickness="0" Background="Black" Grid.RowSpan="5" /> 

          <TextBlock Text="{TemplateBinding Title}" FontSize="24" Grid.Row="1" Foreground="White" HorizontalAlignment="Center" Margin="10"/> 

          <Controls:SurfaceScrollViewer Grid.Row="3" Margin="5" Elasticity="0.0, 0.5" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto"> 
           <ItemsControl x:Name="items" Background="Transparent" ItemsSource="{TemplateBinding MenuItems}"> 
            <ItemsControl.Style> 
             <Style> 
              <Setter Property="ItemsControl.ItemsPanel"> 
               <Setter.Value> 
                <ItemsPanelTemplate> 
                 <StackPanel /> 
                </ItemsPanelTemplate> 
               </Setter.Value> 
              </Setter> 
              <Setter Property="ItemsControl.ItemTemplate"> 
               <Setter.Value> 
                <DataTemplate> 
                 <Controls:MyButton HorizontalContentAlignment="Center" Margin="3" Content="(Bound Stuff)" Background="(Bound Stuff)"/> 
                </DataTemplate> 
               </Setter.Value> 
              </Setter> 
             </Style> 
            </ItemsControl.Style> 
           </ItemsControl> 
          </Controls:SurfaceScrollViewer> 

         </Grid> 
        </Grid> 
       </Adorner> 
      </AdornerLayer> 
     </AdornerDecorator> 
    </Grid> 
</Window> 
+0

На данный момент мне пришлось добавить панель прокрутки в SurfaceScrollViewer, чтобы обойти эту проблему. Это означает, что пользователи планшета могут, по крайней мере, использовать это для прокрутки списка. Странно, что когда вы используете полосу прокрутки, она иногда блокируется и перестает работать до тех пор, пока содержимое не будет перезагружено. Это как-то связано с AdornerLayer ?? –

ответ

1

ОК - Я добрался до конца. Я понял, что ответ тот же самый, который появился несколько раз во время этого проекта, но я все равно теряю его время от времени. Возможно, на этот раз он утонет навсегда!

Проблема была в ItemControl. Это не контроль над поверхностью, и поэтому он не играл красиво с элементами управления Surface. Я думаю, что, по сути, происходит то, что элементы управления поверхностью, как правило, сожрают события, прежде чем что-либо еще получит шанс - или, может быть, это наоборот.

В любом случае, я заменил его следующим SurfaceListBox, и это сработало!

<Controls:SurfaceListBox x:Name="items" Margin="5" Grid.Row="3" Background="Transparent" ItemsSource="{TemplateBinding MenuItems}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Hidden"> 
    <Controls:SurfaceListBox.Resources> 
     <Converters:PropertyNameReflectionConverter x:Key="ButtonContentConverter"/> 
     <Converters:SelectedItemBackgroundConverter x:Key="ButtonBackgroundConverter"/> 
    </Controls:SurfaceListBox.Resources> 
    <Controls:SurfaceListBox.ItemContainerStyle> 
     <Style TargetType="Controls:SurfaceListBoxItem"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type Controls:SurfaceListBoxItem}"> 
         <ContentPresenter /> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Controls:SurfaceListBox.ItemContainerStyle> 
    <Controls:SurfaceListBox.ItemTemplate> 
     <DataTemplate DataType="Controls:MyButton"> 
      <Controls:MyButton HorizontalContentAlignment="Center" Margin="3" Background="(Bound Stuff)" Content="(Bound Stuff)"/> 
     </DataTemplate> 
    </Controls:SurfaceListBox.ItemTemplate> 
</Controls:SurfaceListBox> 
0

Проблема не с ItemsControl, но сам SurfaceScrollViewer, для вас, чтобы скроллинг с сенсорным/мышь, перетаскивая установить PanningMode в SurfaceScrollViewer другим, чем «None».