2010-07-15 2 views
3

WPF 4.0:événements tactiles multi-touch manger ScrollViewer

Je défiler spectateur avec beaucoup Sliders à l'intérieur de celui-ci. Je veux que la visionneuse défile avec le toucher, et je veux que le curseur interne réagisse aussi au toucher.

Malheureusement, la visionneuse de défilement mange les événements "TouchMove" et ne les transmet pas au contrôle du curseur. Une idée de comment résoudre ce problème?

Voici mon XAML:

<Window x:Class="ScrollingTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <ItemsControl ItemsSource="{Binding}"> 
      <ItemsControl.Template> 
       <ControlTemplate> 
        <ScrollViewer VerticalScrollBarVisibility="Auto" PanningMode="Both" > 
         <ItemsPresenter /> 
        </ScrollViewer> 
       </ControlTemplate> 
      </ItemsControl.Template> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <Border Height="100" BorderThickness="2" BorderBrush="Black"> 
         <Slider Value="{Binding ., Mode=TwoWay}" Width="300" Minimum="0" Maximum="100" /> 
        </Border> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </Grid> 
</Window> 

Et mon code-behind:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = Items; 
    } 

    public IEnumerable<int> Items 
    { 
     get 
     { 
      return Enumerable.Range(0, 50); 
     } 
    } 
} 

Répondre

0

Cela ressemble à un cas de "événement routé marqué comme géré". Pouvez-vous essayer d'utiliser AddHandler pour vous abonner à cet événement, et définir le dernier paramètre "processedEventsToo" sur true?

Cheers, Laurent

+0

Bonne suggestion, Laurent. J'ai essayé, mais je n'ai toujours pas l'événement TouchMove. J'ai essayé de surcharger le OnTouchMove aussi ... mais il ne met jamais "Handled" à true dans la base ... blerg. –

+0

Je suis nouveau dans le domaine des gestes tactiles; Devriez-vous enregistrer un gestionnaire d'événements une fois que vous avez un événement TouchDown? Ou est-ce que le système dépend de certains matériels pour déclencher TouchMove, ce que vous n'avez peut-être pas? Juste devine. –

+0

Lorsque le curseur ne se trouve pas dans une visionneuse de défilement, tout fonctionne correctement car les événements tactiles sont traduits en événements de souris. Je peux même obtenir l'événement TouchMove sans la visionneuse de défilement. MAIS, une fois que le visualiseur de défilement prend le relais, il ne laisse pas l'événement TouchMove tomber, donc il n'a jamais la chance d'être traduit comme un mouvement de souris. –

0

Il est gestion de l'événement TouchMove, le plus probable. Il existe des événements de bulles (PreviewTouchMove, etc.) que vous pouvez gérer dans votre contrôle Slider. Vous devez coordonner la manière dont vous souhaitez gérer les événements tactiles.

+0

Pour autant que je sache, le drapeau "Handled" n'est jamais défini sur True pour PreviewTouchMove ou TouchMove. Pourtant, les événements ne se rendent jamais au curseur. TouchDown FAIT, cependant, le faire tomber. J'ai essayé CaptureTouch quand cela arrive ... mais toujours pas de chance :( –

0

Vous pouvez essayer de créer votre classe personnalisée, dérivée de ScrollViewer et remplacer la méthode OnTouchMove.

public class CustomScrollViewer : System.Windows.Controls.ScrollViewer 
{ 
    protected override void OnTouchMove(System.Windows.Input.TouchEventArgs e) 
    { 
     // delete the base.OnTouchMove() call to prevent event being "eat" :) 
    } 
} 

Ensuite, vous modifiez le XAML comme ceci:

<Window x:Class="ScrollingTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <ItemsControl ItemsSource="{Binding}"> 
      <ItemsControl.Template> 
       <ControlTemplate> 
        <local:CustomScrollViewer VerticalScrollBarVisibility="Auto" PanningMode="Both" > 
         <ItemsPresenter /> 
        </local:CustomScrollViewer> 
       </ControlTemplate> 
      </ItemsControl.Template> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <Border Height="100" BorderThickness="2" BorderBrush="Black"> 
         <Slider Value="{Binding ., Mode=TwoWay}" Width="300" Minimum="0" Maximum="100" /> 
        </Border> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </Grid> 
</Window> 
Questions connexes