2012-03-26 11 views
1

Wir schreiben eine Anwendung für Windows-Tablet-PCs. Ich habe ein benutzerdefiniertes Steuerelement erstellt, das eine SurfaceScrollViewer verwendet, um eine vertikale und bildlauffähige Liste auf der rechten Seite des Fensters zu rendern. Das Steuerelement verwendet einen Adorner, um sich selbst dem Adorner-Layer des Fensters hinzuzufügen, sodass es über den oberen Rand des Fensterinhalts gerendert werden kann.Warum ist mein SurfaceScrollViewer nicht durch Ziehen scrollbar?

Es funktioniert wirklich gut, aber die Surface Scroll Viewer wird nur durch das Mausrad oder durch die Bildlaufleiste scrollen. Ich möchte die Bildlaufleiste ausblenden und sich darauf verlassen können, dass der Benutzer die Liste per Berührung zieht, aber das funktioniert nicht. Wir haben die SurfaceScrollViewer Kontrolle an anderer Stelle in diesem Projekt verwendet und das hat gut funktioniert, also vermute ich, dass dieses Problem entweder auf die Art und Weise zurückzuführen ist, wie das Steuerelement erstellt wurde, oder vielleicht, weil es in einem AdornerLayer ist? Etwas mit dem Registrieren der Berührung mit Surface zu tun? Das Seltsame ist, dass die SurfaceButton Steuerelemente in der Liste funktionieren.

Jede Hilfe oder Beratung würde am meisten geschätzt werden. Dies ist im Grunde die benutzerdefinierte Steuerung. Ich habe ein paar Binding Bits und Stücke entfernt, um die Größe zu reduzieren, und ich habe die umgebenden Window/AdornerLayer/Adorner Elemente hinzugefügt, um es in den Kontext zu setzen.

BEARBEITEN - Der Adorner wird der Adorner-Ebene eines Gitters hinzugefügt, das ein Kind des Fensters ist. Ich habe den XAML unten aktualisiert.

<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

Jetzt musste ich dem SurfaceScrollViewer eine Bildlaufleiste hinzufügen, um dieses Problem zu umgehen. Dies bedeutet, dass Tablet-Benutzer zumindest das zum Scrollen der Liste verwenden können. Die seltsame Sache ist, dass wenn Sie die Bildlaufleiste verwenden, wird es manchmal blockieren und aufhören zu arbeiten, bis der Inhalt neu geladen wird. Hat das etwas mit der AdornerLayer zu tun? –

Antwort

1

Okay - ich bin auf den Grund davon gekommen. Ich erkannte, dass die Antwort die gleiche ist, die während dieses Projekts mehrmals auftaucht, aber ich verliere sie immer noch aus den Augen. Vielleicht wird es diesmal für immer einsinken!

Das Problem war das ItemsControl. Es ist kein Surface-Steuerelement und daher spielte es nicht gut mit den Surface-Steuerelementen. Ich denke im Wesentlichen, was passiert, ist, dass die Surface-Steuerungen dazu neigen, Ereignisse zu verschlingen, bevor irgendetwas anderes eine Chance bekommt - oder vielleicht ist es umgekehrt.

Wie auch immer, ich ersetzte es durch die folgende SurfaceListBox und das hat ein Vergnügen gemacht!

<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

Das Problem ist nicht mit dem Items aber die SurfaceScrollViewer selbst, für Sie mit Touch/Maus zu erlauben, das Scrollen mit dem PanningMode des SurfaceScrollViewer auf eine andere Option ziehen als „None“.