2010-07-15 48 views
3

WPF 4.0:多点触控的ScrollViewer吃触摸事件

我已经滚动查看器,它里面很多滑块。我希望滚动查看器可以平移触摸,并且我希望内部滑块也能够响应触摸。

不幸的是,滚动查看器正在吃掉“TouchMove”事件,而不是将它们传递给滑块控件。任何想法如何解决这个问题?

这是我的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> 

我的代码隐藏:

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

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

回答

0

这听起来像 “标记为处理路由事件” 的情况。你可以尝试使用AddHandler来订阅该事件,并将最后一个参数“handledEventsToo”设置为true?

干杯, 洛朗

+0

好的建议,洛朗。我尝试过,但我仍然没有得到TouchMove事件。我已经尝试覆盖OnTouchMove以及...但它从来没有设置“处理”为真正的基地... blerg。 – 2010-07-15 19:10:39

+0

我是新的触摸手势的东西;一旦您有TouchDown事件,您是否需要注册一个事件处理程序?或者系统是否依靠某些硬件来触发您可能没有的TouchMove? 只是猜测。 – 2010-07-15 21:23:22

+0

当滑块不在滚动查看器中时,一切正常,因为触摸事件转换为鼠标事件。我甚至可以在没有滚动查看器的情况下获得TouchMove事件。但是,一旦滚动查看器接管,它不会让TouchMove事件停机,所以它永远不会有机会作为鼠标移动来翻译。 – 2010-07-15 22:07:30

0

它处理的TouchMove事件,最有可能的。 Bubider事件(PreviewTouchMove等)可以在Slider控件中处理。您需要协调您希望如何处理触摸事件。

+0

据我所知,对于PreviewTouchMove或TouchMove,“处理”标志永远不会设置为True。尽管如此,这些事件从来没有下到滑块。 TouchDown DOES,但是,它会降低。发生这种情况时我试过CaptureTouch ......但仍然没有运气:( – 2010-07-15 19:17:34

0

您可以尝试使您的自定义类,从ScrollViewer派生并重写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" :) 
    } 
} 

然后,您编辑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> 
        <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>